什么时候赋值运算符返回const T& T&还是T?

时间:2017-04-19 05:22:44

标签: c++ operator-overloading assignment-operator

根据此article,赋值运算符可以具有以下形式之一:

(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)只应用于const对象(构造后不会改变)。这是对的吗?

我的问题是:我何时应该使用哪种返回类型MyClassMyClass &const MyClass &

1 个答案:

答案 0 :(得分:1)

它实际上不仅仅是过时的,而是错误的。赋值运算符(成员operator=)可以为多种类型重载,而不仅仅是类类型本身,并且返回类型根本不受限制。

作为一种风格问题,为了与内置类型保持一致,返回对象的非const引用是很常见的,但我个人更喜欢void。这使得(几乎)不可能将赋值表达式用作子表达式,如a=b && c=d中所示。我认为这是一个优势。

正如评论所说,C ++ 11添加了移动操作,因此您应该考虑void MyClass::operator=(MyClass&&)是否对您有益。