C++中为何编译器选择类型转换构造函数而非转换运算符?
为何编译器优先选择B的转换构造函数而非A的转换运算符?
#include <iostream> using namespace std; class A; class B{ private: int j=0; int i; public: B (const A& tempA){ cout<<"B construct from A"<<endl; } B(){} }; class A{ public: friend class B; A(){}; A& operator=(const A& temp){ cout<<"operator= overloaded"<<endl; this->value=temp.value; return *this; } operator B() const{ cout<<"B cast"<<endl; return B(); } ~A(){}; private: int value=0; }; int main(){ A a; B b; b=a; }
程序输出如下:
B construct from A
问题解答
给定上述代码,编译器选择B的转换构造函数而非A的转换运算符的原因如下:
当需要将源类型
A转换为目标类型B时,同时存在两种可行的用户定义转换路径:B类的转换构造函数B(const A&),可直接将A对象转换为B对象;A类的转换运算符operator B() const,可将A对象转换为B对象。
根据C++标准,这两种路径属于同等优先级,理论上会触发二义性编译错误。
你的代码能编译并输出构造函数的信息,是因为部分编译器(如GCC)在这种场景下会优先选择目标类型(
B)的转换构造函数,而非源类型(A)的转换运算符。这属于编译器的特定实现选择,并非标准强制要求——严格来说这类代码存在二义性,不同编译器可能有不同表现,甚至直接报错。若需明确指定转换方式,可通过显式转换消除二义性:
- 强制使用
B的构造函数:b = B(a); - 强制使用
A的转换运算符:b = a.operator B();
- 强制使用
内容的提问来源于stack exchange,提问作者yingma
相关产品推荐
相关产品推荐

