【发布时间】: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 对象(构造后不会更改)。对吗?
我的问题是:我应该什么时候使用MyClass、MyClass & 或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