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

问题描述 投票:2回答:1

考虑一下这个例子。

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

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

c++ type-conversion overload-resolution
1个回答
3
投票

这是否意味着标准转换比用户自定义转换更受欢迎?

是的,标准转换总是比用户定义的转换更受欢迎。请看 这个

在决定最佳匹配的过程中,编译器根据调用中传递的类型和竞争参数列表的匹配方式进行评级系统。按匹配的好坏顺序递减。

  • 完全匹配,例如参数是双数,参数是双数。
  • 晋升
  • 标准型转换
  • 构造函数或用户定义的类型转换
© www.soinside.com 2019 - 2024. All rights reserved.