Hardperfect-forwardingrvalue

Что такое perfect forwarding и как он работает?

1Постановка

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

2Решение

Perfect forwarding — передача аргументов функции-обёртки в другую функцию с сохранением категории значения (lvalue/rvalue) и cv-квалификаторов. Реализуется через forwarding reference T&& + std::forward<T>.

template<typename T>
void wrapper(T&& x) {
    target(std::forward<T>(x));  // сохраняет lvalue/rvalue
}

std::string s;
wrapper(s);                  // T = string&,  передаёт как lvalue
wrapper(std::move(s));       // T = string,   передаёт как rvalue

Секрет: в контексте вывода шаблонного аргумента T&& — forwarding reference. Если передать lvalue типа U, T выводится как U&, и T&& сворачивается в U& (reference collapsing). std::forward<T>(x) — условный cast: если T ссылка → lvalue ref, иначе rvalue ref. Лежит в основе make_unique, emplace_back, std::bind.

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

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

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