Hardforwarding-referencervalue

Чем отличается `T&& x` от `T& x` в шаблоне?

1Постановка

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

2Решение

В нешаблонном коде T&& — это rvalue reference (только rvalues). Но в шаблоне с выведением template<typename T> void f(T&& x) — это forwarding reference, который сворачивается в зависимости от аргумента.

template<typename T> void f(T&& x);

int a = 1;
f(a);             // lvalue: T = int&,  T&& = int&  &  = int&
f(std::move(a));  // rvalue: T = int,   T&& = int&&

// НЕ forwarding reference — T&& не в выводимом контексте:
template<typename T> void g(std::vector<T>&& v);  // обычный rvalue ref

Условие для forwarding reference: T должен выводиться именно из этого аргумента (template<typename T> void f(T&&)), а не из вложенного vector<T>&&. Это позволяет одной функции принимать и lvalue, и rvalue для perfect forwarding через std::forward<T>.

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

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

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