Mediummove-semanticsperfect-forwarding
Чем std::move отличается от std::forward?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
std::move — безусловный cast к rvalue reference («точно двигай»). std::forward<T> — условный cast («двигай только если исходный аргумент был rvalue»). Внутри оба — static_cast<T&&>(x).
// move — в обычном коде, когда явно отдаём ресурс
std::string s = load();
vec.push_back(std::move(s));
// forward — в шаблонной обёртке, сохраняем категорию аргумента
template<typename T>
void wrapper(T&& x) {
target(std::forward<T>(x));
}Правило: move — для конкретных объектов, которые вы явно двигаете; forward — для forwarding reference, где категория зависит от вызывающего.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.