过载分辨率和用户定义的转换



考虑这个例子:

struct Foo
{
Foo(int){cout << "Foo(int)n";}
Foo(double){cout << "Foo(double)n";}
operator int()const{cout << "operator int()n"; return 0;}
operator double()const{cout << "operator double()n"; return 0.;}
};
void bar(Foo){cout << "bar(Foo)n";}
void bar(float){cout << "bar(float)n";}

int main()
{
int i = 5;
bar(i); // whey bar(float) and not bar(Foo)?
}
  • 我知道我不应该重载"转换-ctor"来采用相关类型(这里是算术类型(,而只是为了理解更好的函数匹配和用户定义的转换。

  • 为什么对bar的调用被解析为bar(float)而不是bar(Foo),只要Foo与这个参数完全匹配(int(?

  • 这是否意味着标准转换优先于用户定义的转换?

这是否意味着标准转换优于用户定义的转换?

是的。标准转换始终优先于用户定义的转换。看到这里

在确定最佳匹配时,编译器使用评级系统,用于确定调用中传递的类型与竞争参数列表的匹配方式。按匹配优度降序排列:

  • 完全匹配,例如参数是双精度,参数是双精度
  • 一次促销
  • 标准类型转换
  • 构造函数或用户定义类型转换

最新更新