亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

轉換構造函數與轉換運算符:優先級

轉換構造函數與轉換運算符:優先級

湖上湖 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條經驗 獲得超6個贊

似乎MSVS2008對構造函數選擇有自己的見解:無論A運算符的常量性如何,它都在B中調用復制構造函數。因此,即使標準指定了正確的行為,在這里也要小心。


我以為MSVS只是在轉換運算符之前搜索合適的構造函數,但隨后發現,如果從B的構造函數中刪除const字,它將開始調用A的運算符B()。對于臨時對象,它可能具有某些特殊行為,因為以下代碼仍調用B的構造函數:


A a;


B b = a;


查看完整回答
反對 回復 2019-10-26
  • 3 回答
  • 0 關注
  • 636 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號