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

VS 2010 : 2 overloads have similar conversions

本文关键字:转换 重载 2010 VS      更新时间:2023-10-16

我不明白这里发生了什么

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);
}

编译时,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)'

我不明白为什么布尔参数不足以解决重载。我已经看到了这个问题,正如接受的答案所指出的那样,布尔应该更喜欢布尔超载。就我而言,我看到第一个参数不足以选择好的函数,但是为什么第二个参数不能解决歧义?

重载规则比您想象的要复杂一些。您可以分别查看每个参数,并为该参数选择最佳匹配项。然后,如果只有一个重载为每个参数提供最佳匹配,那就是调用的重载。在示例中,第一个参数的最佳匹配是 func 的第二个版本,因为它只需要将 B 转换为 B& ;func的另一个版本需要将B转换为B&,然后B&转换为A&。对于第二个参数,func的第一个版本是最佳匹配,因为它不需要转换。第一个版本对第二个参数具有最佳匹配,但它对第一个参数没有最佳匹配,因此不考虑它。同样,第二个版本对第一个参数具有最佳匹配,但它对第二个参数没有最佳匹配,因此不考虑它。现在没有func的版本了,调用失败。

重载解析规则比皮特·贝克尔(Pete Becker(写的还要复杂。对于f的每个重载,编译器不仅计算需要转换的参数数量,还计算转换的秩。

排名 1

无需转换

左值到重值转换

数组到指针的转换

函数到指针的转换

资格转换

等级 2

整体促销

浮点促销

排名 3

积分转换

浮点转换

浮积分转换

指针转换

指向成员转换的指针

布尔转换

假设所有候选函数都是非模板函数,则当且仅当函数具有一个参数,该参数的排名优于其他候选函数中同一参数的排名,

并且其他参数的排名不差时,该函数获胜。

现在让我们看一下OP案例。

  • func(A&, bool):转换 B&->A& (排名 3( 为第一个参数,第二个参数的完全匹配(排名 1(。
  • func(B&, double):第一个参数的完全匹配(秩 1(,第二个参数的转换bool->double(秩 3(。

结论:没有人赢。