过载解析和用户定义的转换

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

Does it mean that standard conversion is preferred over user-defined conversion?

是的。标准转换总是优先于用户定义的转换。参见 this

在决定最佳匹配时,编译器会根据调用中传递的类型与竞争参数列表匹配的方式对评级系统进行处理。按匹配度降序排列:

  • 完全匹配,例如参数是 double 且参数是 double
  • 升职
  • 标准类型转换
  • 构造函数或用户自定义类型转换