移动赋值运算符
2023年12月31日 2024年1月1日
move-assignment operator
赋值运算符重载, 使用赋值运算符 =
为类对象赋值时调用
作为类的成员函数
- 赋值运算符的左侧运算对象绑定到
*this
- 接受一个参数, 是自身类类型的右值引用, 作为右侧运算对象
- 返回
*this
的左值引用
移动赋值运算符匹配右值
移动赋值运算符的两种形式
-
形参为右值引用
1T &operator=(T &&rhs);
使用此版本
-
形参为具有底层const的右值引用
需承诺不会抛出异常
使用noexcept关键字
参考StrVec的移动赋值运算符
- 必须正确处理自赋值: 检查this指针与rhs的地址是否相同
- 销毁左侧对象
1StrVec &StrVec::operator=(StrVec &&rhs) noexcept 2{ 3 if (this != &rhs) 4 { 5 free(); 6 elements = rhs.elements; 7 first_free = rhs.first_free; 8 cap = rhs.cap; 9 rhs.elements = rhs.first_free = rhs.cap = nullptr; 10 } 11 return *this; 12}