为了账号安全,请及时绑定邮箱和手机立即绑定

转换构造函数与转换运算符:优先级

转换构造函数与转换运算符:优先级

湖上湖 2019-10-26 13:08:06
在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条经验 获得超5个赞

似乎MSVS2008对构造函数选择有自己的见解:无论A运算符的常量性如何,它都在B中调用复制构造函数。因此,即使标准指定了正确的行为,在这里也要小心。


我以为MSVS只是在转换运算符之前搜索合适的构造函数,但随后发现,如果从B的构造函数中删除const字,它将开始调用A的运算符B()。对于临时对象,它可能具有某些特殊行为,因为以下代码仍调用B的构造函数:


A a;


B b = a;


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 573 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信