Easymove-semantics

В каком состоянии находится объект после std::move?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

После move объект остаётся в валидном, но unspecified состоянии. Можно вызывать деструктор, присваивать новое значение, но нельзя читать текущее значение без проверки.

std::string s = "hello";
auto x = std::move(s);
// s в unspecified состоянии, но валидном
s = "new";      // OK — присвоить
s.clear();      // OK
// if (s == "...") — НЕЛЬЗЯ полагаться на значение

Для разных типов поведение отличается:

  • std::string/std::vector — обычно пустые (но не guaranteed);
  • int — значение не изменилось (move для int — это copy);
  • пользовательские типы — нужно документировать состояние.

Гарантируется только valid-but-unspecified, не «пустой». Полагаться на конкретное состояние STL-типов в портабельном коде нельзя.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.