Выбор ответа Middle Move-семантика спрашивают часто обновлено
return std::move(local)
Вопрос
Почему return std::move(result); для локальной переменной result обычно хуже, чем return result;?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Мешает NRVO: вместо создания на месте будет перемещение. При return result; компилятор может применить NRVO (вообще без перемещения), а если не может, всё равно использует перемещение.
Варианты ответа
- Мешает NRVO: вместо создания на месте будет перемещениеправильный ответ
- Не компилируется:
std::moveнельзя применять вreturn - Приводит к копированию вместо перемещения, так как тип const
- Оставляет висячую ссылку на уничтоженный локальный объект
Разбор
При return result; компилятор может применить NRVO (вообще без перемещения), а если не может, всё равно использует перемещение. Выражение std::move(result) уже не имя переменной, и NRVO запрещено: остаётся гарантированное перемещение. GCC предупреждает -Wpessimizing-move.
- Код компилируется.
- Копирования нет: возвращаемое значение перемещается.
- Возврат по значению не создаёт висячих ссылок.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding