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

Состояние после перемещения

Вопрос

В каком состоянии std::string s после auto t = std::move(s);?

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

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

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

Коротко

Правильный ответ: Корректном, но неуказанном: можно присвоить новое значение или уничтожить. Стандарт требует для объектов библиотеки «valid but unspecified state».

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

  1. Корректном, но неуказанном: можно присвоить новое значение или уничтожитьправильный ответ
  2. Гарантированно пустая строка: стандарт требует s.empty() == true
  3. Неопределённом: любое обращение к s, даже присваивание, это UB
  4. Значение не изменилось: перемещение строк всегда копирует символы

Разбор

Стандарт требует для объектов библиотеки «valid but unspecified state». На практике s почти всегда пуста, но полагаться на это нельзя; можно вызвать s.clear() или присвоить новое значение.

  • Пустоту гарантирует, например, std::unique_ptr после перемещения, но не std::string.
  • Использовать объект можно, нельзя только рассчитывать на его значение.
  • Перемещение строк забирает буфер (кроме коротких строк в SSO, где символы копируются).

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

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