为什么我们没有看到“未定义调用重载函数”错误,代码如下?只是因为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 );
}
答案 0 :(得分:7)
它与内置类型无关。您为operator int
定义了B
。这意味着您提供了从B
到int
的用户定义转化。根据该标准的12.3.4,“最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。”这就是它未转换为A
的原因,因为这需要两次隐式转换。
确定何时发生这种情况的规则有些复杂,因此很多人建议您避免提供用户定义的转换。定义这些的另一种方法是为构造函数提供一个参数;您可以在开头添加explicit
以避免隐式应用。
当您致电f(b)
时,编译器会应用您提供的转化功能将b
转换为int
。如果您想将其转换为A
,则必须定义从B
到A
的转化,或明确应用其中一项转化,例如f(int(b))
或{ {1}}。