在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
提交
取消