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