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 подскажет развёрнутый ответ в реальном времени.