Переместить оператор присваивания
В языке программирования C++ оператор перемещения перемещения =
используется для переноса временного объекта в существующий объект. Оператор присваивания перемещения, как и большинство операторов C++, может быть перегружен . Как и оператор присваивания копирования, это специальная функция-член .
Если оператор перемещения перемещения не определен явно, компилятор генерирует неявный оператор перемещения перемещения ( C++11 и новее) при условии, что конструкторы копирования / перемещения , оператор копирования копирования или деструкторы не были объявлены. [1] Параметр оператора присваивания перемещения — это ссылка rvalue (T&&) на тип 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_;
};
Ссылки
[ редактировать ]- ^ Jump up to: а б «Переместить оператор присваивания — cppreference.com» . ru.cppreference.com . Проверено 23 февраля 2016 г.
- ^ «Конструкторы перемещения и операторы присваивания перемещения (C++)» . msdn.microsoft.com . Проверено 23 февраля 2016 г.