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

在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-面向对象的实践中是否有任何建议可以说明这种情况?就我个人而言,无论哪种方式都有意义,因此我很想知道如何做出选择。

提前致谢


湖上湖
浏览 577回答 3
3回答

慕勒3428872

似乎MSVS2008对构造函数选择有自己的见解:无论A运算符的常量性如何,它都在B中调用复制构造函数。因此,即使标准指定了正确的行为,在这里也要小心。我以为MSVS只是在转换运算符之前搜索合适的构造函数,但随后发现,如果从B的构造函数中删除const字,它将开始调用A的运算符B()。对于临时对象,它可能具有某些特殊行为,因为以下代码仍调用B的构造函数:A a;B b = a;
打开App,查看更多内容
随时随地看视频慕课网APP