在SO上阅读有关转换运算符和构造函数的一些问题后,我开始思考它们之间的交互,即何时存在“模棱两可”的调用。考虑以下代码:
class A;
class B {
public:
B(){}
B(const A&) //conversion constructor
{
cout << "called B's conversion constructor" << endl;
}
};
class A {
public:
operator B() //conversion operator
{
cout << "called A's conversion operator" << endl;
return B();
}
};
int main()
{
B b = A(); //what should be called here? apparently, A::operator B()
return 0;
}
上面的代码显示“称为A的转换运算符”,这意味着与构造函数相反,该转换运算符被调用。如果您operator B()从中删除/注释掉代码A,编译器将很乐意切换到使用构造函数(无需对代码进行其他更改)。
我的问题是:
由于编译器不认为B b = A();是模棱两可的调用,因此这里必须有某种优先级在起作用。确切的位置在哪里建立?(来自C ++标准的引用/引用将不胜感激)
从面向对象的哲学角度来看,这是代码应该如何行为的方式吗?谁更了解A对象应如何成为B对象,A或者B?根据C ++,答案是A-面向对象的实践中是否有任何建议可以说明这种情况?就我个人而言,无论哪种方式都有意义,因此我很想知道如何做出选择。
提前致谢
慕勒3428872