【问题标题】:When should the assignment operator return const T &, T & or T?赋值运算符何时应返回 const T &、T & 或 T?
【发布时间】:2017-09-15 04:02:03
【问题描述】:

根据这个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 & 的返回类型?

【问题讨论】:

  • (2), (5), (8) 是实现“移动语义”之类的必要条件。
  • 来自this canonical assignment operator reference:“规范的复制赋值运算符应...通过引用返回lhs”。此外,copy 赋值运算符不应修改其 rhs,因此它最好是对常量的引用。虽然有时按值传递可能很有用(如之前链接的参考中所见)。
  • @Scheff 不,您正在考虑operator=( MyClass && )。问题有operator=( MyClass & )
  • @Someprogrammerdude 不。我想到了必须修改源的分配(例如在 std::uniqueptr 中)。我相信在T&& 甚至存在之前我曾经这样做过(在特殊情况下)......
  • 该参考资料最后一次更新是在 2010 年。我建议您找到更新的内容。

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


【解决方案1】:

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

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

正如 cmets 所说,C++11 增加了移动操作,所以你应该考虑void MyClass::operator=(MyClass&&) 是否对你有益。

【讨论】:

    猜你喜欢
    • 2014-10-27
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多