Выбор ответа Middle Move-семантика спрашивают часто обновлено

return std::move(local)

Вопрос

Почему return std::move(result); для локальной переменной result обычно хуже, чем return result;?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Мешает NRVO: вместо создания на месте будет перемещение. При return result; компилятор может применить NRVO (вообще без перемещения), а если не может, всё равно использует перемещение.

Варианты ответа

  1. Мешает NRVO: вместо создания на месте будет перемещениеправильный ответ
  2. Не компилируется: std::move нельзя применять в return
  3. Приводит к копированию вместо перемещения, так как тип const
  4. Оставляет висячую ссылку на уничтоженный локальный объект

Разбор

При return result; компилятор может применить NRVO (вообще без перемещения), а если не может, всё равно использует перемещение. Выражение std::move(result) уже не имя переменной, и NRVO запрещено: остаётся гарантированное перемещение. GCC предупреждает -Wpessimizing-move.

  • Код компилируется.
  • Копирования нет: возвращаемое значение перемещается.
  • Возврат по значению не создаёт висячих ссылок.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.