为什么我们在下面的代码中看不到“未定义的重载函数调用”错误?仅仅因为 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 );
}
最佳答案
它与内置类型无关。您为 B
定义了 operator int
。这意味着您已经提供了从 B
到 int
的用户定义转换。根据标准的 12.3.4,“最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。”这就是它没有转换为 A
的原因,因为这需要两次隐式转换。
准确确定何时发生这种情况的规则有些复杂,因此许多人建议您避免提供用户定义的转换。定义这些的另一种方法是为构造函数提供一个参数;您可以将 explicit
添加到开头以避免它被隐式应用。
当您调用 f(b)
时,编译器应用您提供的转换将 b
转换为 int
。如果要将其转换为 A
,则必须定义从 B
到 A
的转换,或者显式应用其中一种转换,例如 f(int(b))
或 f(A(b))
。
关于c++ - 函数重载和类型转换解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799841/