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