移动赋值运算符
C++语言中,移动赋值运算符(move assignment operator)=
用于把一个临时对象转移给一个已存在对象并可以运算符重载。类似于复制赋值运算符,移动赋值运算符也是特殊成员函数。这是从C++11开始引入的概念。
在没有定义拷贝构造函数、拷贝赋值运算符、析构函数和移动构造函数时,编译器会自动生成移动赋值运算符。[1]在实践中,这个特性非常有用 —— 有些资源只应该被移动而不应该被拷贝,如mutex、socket等
移动赋值运算符的操作数是右值引用类型的(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.0 1.1 Move assignment operator - cppreference.com. en.cppreference.com. [2016-02-23]. (原始内容存档于2020-11-12).
- ^ Move Constructors and Move Assignment Operators (C++). msdn.microsoft.com. [2016-02-23]. (原始内容存档于2017-07-29).