c++ - 为什么使用不匹配的参数调用重载函数仍然有效

标签 c++ function overloading

我无法解释为什么第二个调用 ( 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) 有两个不完全匹配的参数。它需要从 charint 的两次提升。
int fun(int a, char b) 有一个完全匹配和一个从 charint 的提升。
int fun(float a, float b) 有两个不是完美匹配的参数,需要从 charfloat 的转换(比提升更糟糕)。

关于c++ - 为什么使用不匹配的参数调用重载函数仍然有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59532786/

相关文章:

java - 最终类型转换概念不适用于重载

c++ - 为什么 char 既没有符号也没有符号,而 wchar_t 是?

C++ 返回在函数范围内声明的引用

c++ - 在类中初始化变量

c++ - 代码库是什么意思?我如何访问一个?

c++ - 删除未使用的包括

c - 将可变长度的2D数组传递给函数

php - 如何调用 GET 参数中指定的函数?

使用枚举重载 TypeScript 函数

c++ - 在 C++ 中使用模板特化