Оператор присваивания перемещения - Википедия - Move assignment operator

в Язык программирования C ++, то оператор присваивания перемещения = используется для передачи временного объекта существующему объекту. Оператор присваивания перемещения, как и большинство операторов C ++, может быть перегружен. Словно оператор присваивания копий это специальная функция-член.

Если оператор присваивания перемещения не определен явно, компилятор генерирует неявный оператор присваивания перемещения (C ++ 11 и новее) при условии, что копировать /переместить конструкторы, оператор присваивания копий или же деструкторы не были заявлены.[1] Параметр оператора присваивания перемещения - это ссылка rvalue (T &&) набрать Т, куда Т - объект, определяющий оператор присваивания перемещения. Оператор присваивания перемещения отличается от оператора переместить конструктор потому что оператор присваивания перемещения вызывается для существующего объекта, а конструктор перемещения вызывается для объекта, созданного операцией. После этого данные другого объекта больше не действительны.

Перегрузка оператора присваивания перемещения

Чтобы перегрузить оператор присваивания перемещения, подпись функции должна быть:[1]

Т& оператор=(Т&& данные)

Чтобы успешно перегрузить оператор присваивания перемещения, должны быть выполнены следующие условия:

  • Убедитесь, что объект, вызывающий оператора, не вызывает оператора на самом себе.
  • Распределение данных текущего объекта отменяется.
  • Данные перемещаемого объекта должны быть помечены как nullptr (или что-то, чтобы обозначить движение)
  • Оператор должен вернуть ссылку на «* this».

Рассмотрим следующий оператор присваивания перемещения для простого строкового класса:[2]

учебный класс Нить { общественный:  Нить& оператор=(Нить&& Другой) нет кроме {    // Если мы не пытаемся переместить объект в себя ...    если (это != &Другой) {      Удалить[] это->данные_;  // Удаляем исходные данные строки.      это->данные_ = Другой.данные_;  // Копируем данные другой строки в эту строку.      Другой.данные_ = nullptr;  // Наконец, сбрасываем указатель данных другой строки.    }    возвращаться *это;  } частный:  char* данные_;};

Рекомендации

  1. ^ а б «Переместить оператор присваивания - cppreference.com». en.cppreference.com. Получено 2016-02-23.
  2. ^ «Конструкторы перемещения и операторы присваивания перемещения (C ++)». msdn.microsoft.com. Получено 2016-02-23.