函数重载和类型转换解析

时间:2012-10-09 12:16:11

标签: c++ operator-overloading type-conversion overloading

为什么我们没有看到“未定义调用重载函数”错误,代码如下?只是因为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 );
}

1 个答案:

答案 0 :(得分:7)

它与内置类型无关。您为operator int定义了B。这意味着您提供了从Bint的用户定义转化。根据该标准的12.3.4,“最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。”这就是它未转换为A的原因,因为这需要两次隐式转换。

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

当您致电f(b)时,编译器会应用您提供的转化功能将b转换为int。如果您想将其转换为A,则必须定义从BA的转化,或明确应用其中一项转化,例如f(int(b))或{ {1}}。