Hardforward
Что такое perfect forwarding?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Perfect forwarding — механизм, позволяющий шаблонной функции передавать аргументы дальше, сохраняя их категорию значения (lvalue/rvalue) и const. Достигается через forwarding reference T&& + std::forward<T>.
template<class T, class... Args>
auto make(Args&&... args) {
return std::make_unique<T>(std::forward<Args>(args)...);
// lvalue остаётся lvalue, rvalue остаётся rvalue
}
std::string s = "hi";
auto p1 = make<std::string>(s); // s передаётся как lvalue (copy)
auto p2 = make<std::string>(std::move(s)); // s передаётся как rvalue (move)Без perfect forwarding обёртка либо копировала бы (потеря скорости), либо всегда двигала (потеря lvalue-семантики). Применяется в make_unique/make_shared, emplace_back, factory-функциях.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.