考虑一下这个例子。
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)?
}
我知道我不应该重载 "converting-ctor "来接受relate类型(这里是算术类型),但只是为了更好地理解函数匹配和用户自定义转换。
为什么对bar的调用被解析为 bar(float)
而不是 bar(Foo)
只要 Foo
与此参数完全匹配 (int
)?
这是否意味着标准转换优于用户自定义转换?
这是否意味着标准转换比用户自定义转换更受欢迎?
是的,标准转换总是比用户定义的转换更受欢迎。请看 这个
在决定最佳匹配的过程中,编译器根据调用中传递的类型和竞争参数列表的匹配方式进行评级系统。按匹配的好坏顺序递减。