VS 2010:2次重载有类似的转换

und*_*ndu 3 c++ overloading

我不明白这里发生了什么

class A{};
class B : A {};

void func(A&, bool){}
void func(B&, double){}

int main(void)
{
    B b;
    A a;
    bool bo;
    double d;

    func(b, bo);
}
Run Code Online (Sandbox Code Playgroud)

编译时,Visual 2010会在线提供此错误 func(b, bo);

2 overloads have similar conversions
could be 'void func(B &,double)'
or       'void func(A &,bool)'
while trying to match the argument list '(B, bool)'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么bool参数不足以解决过载问题.我已经看到了这个问题,并且在接受的答案中指出,bool应该更喜欢bool重载.在我的情况下,我看到第一个参数不足以选择好的函数,但为什么第二个参数不能解决模糊性?

Pet*_*ker 5

重载规则比您猜测的要复杂一些.您可以分别查看每个参数,并为该参数选择最佳匹配.然后,如果只有一个重载为每个参数提供最佳匹配,那就是被调用的那个.在该示例中,第一个参数的最佳匹配是第二个版本func,因为它只需要转换BB&; 另一个版本func需要转换BB&然后转换B&A&.对于第二个参数,第一个版本func是最佳匹配,因为它不需要转换.第一个版本与第二个参数具有最佳匹配,但它与第一​​个参数没有最佳匹配,因此不予考虑.类似地,第二个版本与第一个参数具有最佳匹配,但它与第二个参数没有最佳匹配,因此不予考虑.现在没有func左侧版本,并且调用失败.