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