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)
它与内置类型无关.你定义operator int的B.这意味着你已经提供了一种由用户定义的转换B到int.根据该标准的12.3.4,"最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值." 这就是它没有转换为的A原因,因为这需要两次隐式转换.
确定何时发生这种情况的确切规则有些复杂,因此很多人建议您避免提供用户定义的转换.定义这些的另一种方法是为构造函数提供一个参数; 您可以添加explicit到开头以避免隐式应用它.
当您调用时f(b),编译器会应用您提供的转换转换b为int.如果您想将其转换为A,则必须定义转化B为A,或明确应用其中一个转化,例如f(int(b))或f(A(b)).