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

Căt*_*rbu 4 c++ overloading function

我无法解释为什么第二个调用 ( 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;
}
Run Code Online (Sandbox Code Playgroud)

Fra*_*eux 6

重载解析的规则很复杂。在这种情况下,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)有两个不是完美匹配的参数,需要从charto转换(比提升更糟糕)float