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