编译器决定不明确的参数

Compiler Deciding Ambiguous Parameter

纯属好奇,编译器如何决定什么类型应该用于一个模棱两可的方法(基于参数大小)。

在我测试过的下面的例子中,我们有method(int i) 和method(char c)。我测试了调用方法('C')和方法(67),分别调用了char和int方法。但是 'C' 只是 67 的 ascii。它是如何决定的,因为 67 也适合作为一个字符(如果我们调用方法(60000),我可以理解调用 int 方法) 是否有优先级或只是将其解析为 char 因为它读取引号以帮助它做出决定。同样,我们是否会对 int 和 long 方法覆盖产生歧义?

void method(int i) {
    std::cout << "int" << std::endl;
}
void method(char c) {
    std::cout << "char" << std::endl;
}

int main() {
    method('C'); // outputs char
    method(67); // outputs int
    return 0;
}

"how does the compiler decide what type should go for an ambigious method " - 不会。如果有什么不明确的地方,那就是编译时错误。在这种情况下,编译器不会选择一件事而不是另一件事,它只是拒绝编译您的代码。

请注意文字 有类型 。在您的示例中,没有歧义。 charint 是不同的类型。

文字也有类型(就像 C++ 中的所有内容,一种静态类型的语言)。

代码中的数字具有类型 int,除非它以 integer literals 为后缀(或者它不适合 int,它将是最低符号它适合的类型,甚至可能是非标准类型 __int128)

5 //int
5u //unsigned int
5ll //long long

带点的数字将被解释为双精度

5. // double
5.f // float

等您可以在 cppreference.

找到更详尽的列表

带单引号的表达式被解释为 char,双引号内的表达式被解释为空终止 const char[](长度与字符串长度 + 空终止符匹配)。

'a' // char
"abc" // const char[4]

因此,您的代码没有歧义。确实char也是整型,不过没关系。字面量类型清晰,编译器可以在任何情况下区分它们。