Middle+
54
questionbank

Расскажите о префиксной перенаправке (perfect forwarding) в C++.

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Префиксная перенаправка (Perfect forwarding) в C++ позволяет передавать аргументы функции в другую функцию, сохраняя при этом их категории значений (lvalue или rvalue) и const/volatile квалификаторы.

Это достигается за счет использования комбинации двух механизмов:

  • Шаблоны функций: Функция, использующая perfect forwarding, должна быть шаблонной.
  • Универсальные ссылки (universal references): Параметры такой шаблонной функции объявляются как 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 наиболее полезен при создании оберток над другими функциями или при передаче аргументов конструкторам при использовании паттернов вроде фабрик или пулов объектов. Он позволяет избежать создания ненужных временных объектов или копий и сохранить эффективность при работе с перемещаемой семантикой.