六一的部落格


关关难过关关过,前路漫漫亦灿灿。



move-assignment operator

赋值运算符重载, 使用赋值运算符 = 为类对象赋值时调用

作为类的成员函数

  • 赋值运算符的左侧运算对象绑定到 *this
  • 接受一个参数, 是自身类类型的右值引用, 作为右侧运算对象
  • 返回 *this 的左值引用

移动赋值运算符匹配右值


移动赋值运算符的两种形式

  1. 形参为右值引用

    1T &operator=(T &&rhs);

    使用此版本

  2. 形参为具有底层const的右值引用


需承诺不会抛出异常

使用noexcept关键字

参考StrVec的移动赋值运算符

  1. 必须正确处理自赋值: 检查this指针与rhs的地址是否相同
  2. 销毁左侧对象
 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}

移动赋值运算符


move-assignment operator

赋值运算符重载, 使用赋值运算符 = 为类对象赋值时调用

作为类的成员函数

  • 赋值运算符的左侧运算对象绑定到 *this
  • 接受一个参数, 是自身类类型的右值引用, 作为右侧运算对象
  • 返回 *this 的左值引用

移动赋值运算符匹配右值


移动赋值运算符的两种形式

  1. 形参为右值引用

    1T &operator=(T &&rhs);

    使用此版本

  2. 形参为具有底层const的右值引用


需承诺不会抛出异常

使用noexcept关键字

参考StrVec的移动赋值运算符

  1. 必须正确处理自赋值: 检查this指针与rhs的地址是否相同
  2. 销毁左侧对象
 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}