跳转到内容

移动赋值运算符

维基百科,自由的百科全书

C++语言中,移动赋值运算符(move assignment operator)=用于把一个临时对象转移给一个已存在对象并可以运算符重载。类似于复制赋值运算符,移动赋值运算符也是特殊成员函数。这是从C++11开始引入的概念。

在没有定义拷贝构造函数、拷贝赋值运算符、析构函数和移动构造函数时,编译器会自动生成移动赋值运算符。[1]在实践中,这个特性非常有用 —— 有些资源只应该被移动而不应该被拷贝,如mutexsocket

移动赋值运算符的操作数是右值引用类型的(T&&),其中T是定义了移动赋值运算符的对象本身。

移动赋值运算符不同于移动构造函数。前者是赋值给一个已存在的对象。后者是创建一个新对象。二者完成后,操作数对象不复存在。

移动赋值运算符的重载

重载移动赋值运算符时,运算符函数的类型必须为:[1]

T& operator=(T&& data)

一般应满足:

  • 检查不会把对象“移动”给自身,这么做无意义。
  • 当前对象的数据要先释放掉。
  • 被移动掉数据的对象必须用nullptr赋给其数据。
  • 运算符必须返回"*this"的引用。

下例为一个简单字符串移动赋值运算符的重载:[2]

class String {
 public:
  String& operator=(String&& other) noexcept {
    // If we're not trying to move the object into itself...
    if (this != &other) {
      delete[] this->data_;  // Free this string's original data.
      this->data_ = other.data_;  // Copy the other string's data pointer into this string.
      other.data_ = nullptr;  // Finally, reset the other string's data pointer.
    }
    return *this;
  }

 private:
  char* data_;
};

参考文献

  1. ^ 1.0 1.1 Move assignment operator - cppreference.com. en.cppreference.com. [2016-02-23]. (原始内容存档于2020-11-12). 
  2. ^ Move Constructors and Move Assignment Operators (C++). msdn.microsoft.com. [2016-02-23]. (原始内容存档于2017-07-29).