过载解析和用户定义的转换
Overload resolution and user-defined conversion
考虑这个例子:
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" 来获取相关类型(这里是算术类型),而只是为了更好地理解函数匹配和用户定义的转换。
为什么只要 Foo
与此参数完全匹配(int
)?
这是否意味着标准转换优先于用户定义的转换?
Does it mean that standard conversion is preferred over user-defined conversion?
是的。标准转换总是优先于用户定义的转换。参见 this
在决定最佳匹配时,编译器会根据调用中传递的类型与竞争参数列表匹配的方式对评级系统进行处理。按匹配度降序排列:
- 完全匹配,例如参数是 double 且参数是 double
- 升职
- 标准类型转换
- 构造函数或用户自定义类型转换
考虑这个例子:
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" 来获取相关类型(这里是算术类型),而只是为了更好地理解函数匹配和用户定义的转换。
为什么只要
Foo
与此参数完全匹配(int
)?这是否意味着标准转换优先于用户定义的转换?
Does it mean that standard conversion is preferred over user-defined conversion?
是的。标准转换总是优先于用户定义的转换。参见 this
在决定最佳匹配时,编译器会根据调用中传递的类型与竞争参数列表匹配的方式对评级系统进行处理。按匹配度降序排列:
- 完全匹配,例如参数是 double 且参数是 double
- 升职
- 标准类型转换
- 构造函数或用户自定义类型转换