函数重载和类型转换解析

ale*_*reC 3 c++ overloading operator-overloading type-conversion

为什么我们没有看到代码低于"未定义调用重载函数"错误?只是因为int是内置类型?我可以在标准中找到转换为内置类型的保证,例如代码如下?...谢谢!

#include <iostream>
using namespace std;

class B {
public:
operator int(){ return 0; }
};

class A {
public:
A( int i ) { };
};

void f ( int i ) { cout << "overload f(int) was used!";};
void f ( A a )   { cout << "overload f(A) was used!" ;};


int main () {
  B b;
  f( b );
}
Run Code Online (Sandbox Code Playgroud)

Dir*_*ple 7

它与内置类型无关.你定义operator intB.这意味着你已经提供了一种由用户定义的转换Bint.根据该标准的12.3.4,"最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值." 这就是它没有转换为的A原因,因为这需要两次隐式转换.

确定何时发生这种情况的确切规则有些复杂,因此很多人建议您避免提供用户定义的转换.定义这些的另一种方法是为构造函数提供一个参数; 您可以添加explicit到开头以避免隐式应用它.

当您调用时f(b),编译器会应用您提供的转换转换bint.如果您想将其转换为A,则必须定义转化BA,或明确应用其中一个转化,例如f(int(b))f(A(b)).

  • ISO标准12.3.4:"最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值." (2认同)