2017-04-19 89 views
0

根據該article,賦值操作符可以具有下列形式之一:賦值運算符何時應返回const T&,T&或T?

(1) MyClass& operator=(const MyClass& rhs); 
(2) MyClass& operator=(MyClass& rhs); 
(3) MyClass& operator=(MyClass rhs); 
(4) const MyClass& operator=(const MyClass& rhs); 
(5) const MyClass& operator=(MyClass& rhs); 
(6) const MyClass& operator=(MyClass rhs); 
(7) MyClass operator=(const MyClass& rhs); 
(8) MyClass operator=(MyClass& rhs); 
(9) MyClass operator=(MyClass rhs); 
  • 的形式(2),(5)和(8)的泄氣因爲賦值操作符不應該修改其參數。我不能想到這是必要的情況。
  • 表格(3),(6)和(9)對於複製交換習語很有用。
  • 我認爲(7) - (9)只能用於常量對象(構造後不會改變)。那是對的嗎?

我的問題是:什麼時候應該使用哪個返回MyClass類型,MyClass &const MyClass &

+0

(2),(5),(8)對於實現類似「移動語義」的東西是必要的。 – Scheff

+2

來自[此規範賦值運算符參考](http://en.cppreference.com/w/cpp/language/operators#Assignment_operator):「規範的賦值賦值運算符預期......通過引用返回lhs」 。另外,* copy *賦值運算符不應該修改它的rhs,所以它應該最好是對常量的引用。儘管傳遞值可能有用(如前面鏈接的參考資料所示)。 –

+2

@Scheff不,你正在考慮'operator =(MyClass &&)'。問題有'operator =(MyClass&)'。 – hvd

回答

1

它實際上不只是過時,而是錯誤的。賦值運算符(成員operator=)可以重載爲多種類型,而不僅僅是類類型本身,並且返回類型根本不受限制。

作爲樣式,返回一個非const引用的對象是常見的與內置類型的一致性,但我個人更喜歡void。這使得(幾乎)不可能將分配表達式用作子表達式,如在a=b && c=d中。我認爲這是一個優勢。

正如註釋註釋,C++ 11添加了移動操作,因此您應該考慮void MyClass::operator=(MyClass&&)是否對您有益。

相關問題