Mediummove-semanticsnoexcept
Почему move-конструкторы должны быть noexcept?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
STL-контейнеры (vector, и т.д.) дают strong exception guarantee при resize: либо операция завершена, либо состояние контейнера не изменилось. При росте вектора нужно перенести элементы в новый буфер.
// vector проверяет is_nothrow_move_constructible<T>:
if constexpr (std::is_nothrow_move_constructible_v<T>)
// move — эффективно
else
// copy — безопасно (можно откатить, если бросит)Если move ctor noexcept — можно безопасно перемещать. Если move может бросить и бросает в середине, исходный буфер уже изменён — состояние потеряно. Поэтому STL в этом случае fallback на copy. Если ваш move ctor не noexcept, vector будет копировать объекты — производительность падает.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.