3

为什么我们在下面的代码中看不到“对重载函数的未定义调用”错误?仅仅因为 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 );
}
4

1 回答 1

7

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

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

当您调用f(b)时,编译器会应用您提供的转换来转换bint。如果要将其转换为A,则必须定义从Bto的转换A,或显式应用其中一种转换,例如f(int(b))or f(A(b))

于 2012-10-09T12:22:50.443 回答