Выбор ответа Middle Move-семантика спрашивают часто обновлено
Состояние после перемещения
Вопрос
В каком состоянии std::string s после auto t = std::move(s);?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Корректном, но неуказанном: можно присвоить новое значение или уничтожить. Стандарт требует для объектов библиотеки «valid but unspecified state».
Варианты ответа
- Корректном, но неуказанном: можно присвоить новое значение или уничтожитьправильный ответ
- Гарантированно пустая строка: стандарт требует
s.empty() == true - Неопределённом: любое обращение к
s, даже присваивание, это UB - Значение не изменилось: перемещение строк всегда копирует символы
Разбор
Стандарт требует для объектов библиотеки «valid but unspecified state». На практике s почти всегда пуста, но полагаться на это нельзя; можно вызвать s.clear() или присвоить новое значение.
- Пустоту гарантирует, например,
std::unique_ptrпосле перемещения, но неstd::string. - Использовать объект можно, нельзя только рассчитывать на его значение.
- Перемещение строк забирает буфер (кроме коротких строк в SSO, где символы копируются).
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding