我无法解释为什么第二个调用 ( B
) 没有给出任何错误,因为有两个 char
元素,并且此调用没有确定的匹配项。
为什么它被称为第二个 ( 2.
) ,而不是第一个 ( 1.
) 版本?
我注意到有一些自动转换。我不明白的是为什么 'a'
被提升为 int 而 'c'
不是。
// 1.
int fun(int a, int b)
{
return a + b;
}
// 2.
int fun(int a, char b)
{
return b - a;
}
// 3
int fun(float a, float b)
{
return a * b;
}
int main() {
// A. B. C.
cout << fun(1,0) << fun('a','c') << fun(2.f,2.f);
return 0;
}
最佳答案
重载决议的规则是 complicated 。在这种情况下,func('a','c')
更喜欢 int fun(int a, char b)
的原因是因为它意味着最少的隐式转换序列。查看每个案例:int fun(int a, int b)
有两个不完全匹配的参数。它需要从 char
到 int
的两次提升。int fun(int a, char b)
有一个完全匹配和一个从 char
到 int
的提升。int fun(float a, float b)
有两个不是完美匹配的参数,需要从 char
到 float
的转换(比提升更糟糕)。
关于c++ - 为什么使用不匹配的参数调用重载函数仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59532786/