在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-面向对象的实践中是否有任何建议可以说明这种情况?就我个人而言,无论哪种方式都有意义,因此我很想知道如何做出选择。提前致谢
3 回答
慕勒3428872
TA贡献1848条经验 获得超6个赞
似乎MSVS2008对构造函数选择有自己的见解:无论A运算符的常量性如何,它都在B中调用复制构造函数。因此,即使标准指定了正确的行为,在这里也要小心。
我以为MSVS只是在转换运算符之前搜索合适的构造函数,但随后发现,如果从B的构造函数中删除const字,它将开始调用A的运算符B()。对于临时对象,它可能具有某些特殊行为,因为以下代码仍调用B的构造函数:
A a;
B b = a;
添加回答
举报
0/150
提交
取消