移动赋值运算符

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

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

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

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

移动赋值运算符的重载 
重载移动赋值运算符时，运算符函数的类型必须为：T& operator=(T&& data)
一般应满足：
 检查不会把对象“移动”给自身，这么做无意义。
 当前对象的数据要先释放掉。
 被移动掉数据的对象必须用nullptr赋给其数据。
 运算符必须返回"*this"的引用。

下例为一个简单字符串移动赋值运算符的重载: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_;
};

参考文献

运算符_(编程)
C++