Префиксная перенаправка (Perfect forwarding) в C++ позволяет передавать аргументы функции в другую функцию, сохраняя при этом их категории значений (lvalue или rvalue) и const/volatile квалификаторы.
Это достигается за счет использования комбинации двух механизмов:
T&&. В зависимости от того, является ли аргумент lvalue или rvalue, T будет выведено как тип аргумента (при передаче rvalue) или как ссылка на тип аргумента (при передаче lvalue).std::forward<T>(): Эта функция-шаблон используется для приведения аргумента param с типом T&& к нужному типу. Если T - ссылочный тип, std::forward<T>(param) вернет lvalue-ссылку. Если T - нессылочный тип, он вернет rvalue-ссылку или lvalue в зависимости от контекста.Пример использования:
cpp
В данном примере forward_to_process шаблонная функция, способная принять как lvalue, так и rvalue int'ов. std::forward<T>(arg) гарантирует, что вызов process_value будет соответствовать категории значения arg.
Perfect forwarding наиболее полезен при создании оберток над другими функциями или при передаче аргументов конструкторам при использовании паттернов вроде фабрик или пулов объектов. Он позволяет избежать создания ненужных временных объектов или копий и сохранить эффективность при работе с перемещаемой семантикой.