赋值运算符
赋值运算符(operator=)有特殊性质: 细节见复制赋值与移动赋值。
对规范的复制赋值运算符, 期待其在自赋值时不进行操作, 并按引用返回 lhs:
1 . // 假设对象保有可重用存储, 例如一个分配于堆的缓冲区 mArray
2 . T& operator=(const T& other) // 复制赋值
3 . {
4 . if (this != &other) { // 期待检查自赋值
5 . if (other .size != size) { // 存储不可复用
6 . delete[] mArray; // 销毁 this 中的存储
7 . size = 0;
8 . mArray = nullptr; // 在下一行抛出的情况下维持不变式
9 . mArray = new int[other .size]; // 分配 this 中的存储
10 . size = other .size;
11 . }
12 . std::copy(other .mArray, other .mArray + other .size, mArray);
13 . }
14 . return *this;
15 . }
对规范的移动赋值, 期待其(即有完好类不变式的状态), 且在自赋值时要么不做任何 事, 要么至少遗留对象于合法状态, 并以非 const 引用返回 lhs, 而且为 noexcept:
1 . T& operator=(T&& other) noexcept // 移动赋值
2 . {
3 . if(this != &other) { // 自赋值时无操作 (delete[]/size=0 亦 OK)
4 . delete[] mArray; // 删除此存储
5 . mArray = std::exchange(other .mArray, nullptr); // 令被移动对象遗留于合法状态
6 . size = std::exchange(other .size, 0);
7 . }
8 . return *this;
9 . }