编译器决定不明确的参数
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 " - 不会。如果有什么不明确的地方,那就是编译时错误。在这种情况下,编译器不会选择一件事而不是另一件事,它只是拒绝编译您的代码。
请注意文字 有类型 。在您的示例中,没有歧义。 char
和 int
是不同的类型。
文字也有类型(就像 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
也是整型,不过没关系。字面量类型清晰,编译器可以在任何情况下区分它们。
纯属好奇,编译器如何决定什么类型应该用于一个模棱两可的方法(基于参数大小)。
在我测试过的下面的例子中,我们有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 " - 不会。如果有什么不明确的地方,那就是编译时错误。在这种情况下,编译器不会选择一件事而不是另一件事,它只是拒绝编译您的代码。
请注意文字 有类型 。在您的示例中,没有歧义。 char
和 int
是不同的类型。
文字也有类型(就像 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
也是整型,不过没关系。字面量类型清晰,编译器可以在任何情况下区分它们。