РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
725 of 815 menu

Функция forward

Функция forward из заголовочного файла <utility> выполняет так называемую идеальную передачу (perfect forwarding). Она принимает один параметр - ссылку на универсальную ссылку, и возвращает значение, сохраняя исходную категорию: если аргумент был lvalue, результатом будет lvalue, а если rvalue - результатом будет rvalue. Это особенно важно при написании шаблонных функций, которые должны передавать свои аргументы дальше без потери информации о типе и категории значения.

Синтаксис

std::forward<T>(arg)

Пример

Давайте рассмотрим простой пример, где функция forward используется для передачи аргумента в другую функцию с сохранением категории значения:

#include <iostream> #include <utility> using namespace std; void process(int& x) { cout << "lvalue: " << x << endl; } void process(int&& x) { cout << "rvalue: " << x << endl; } template<typename T> void wrapper(T&& arg) { process(forward<T>(arg)); } int main() { int a = 5; wrapper(a); wrapper(10); return 0; }

Результат выполнения кода:

"lvalue: 5" "rvalue: 10"

Пример

Давайте рассмотрим пример, демонстрирующий разницу между использованием forward и обычной передачей параметра:

#include <iostream> #include <utility> using namespace std; void check(int& x) { cout << "received lvalue" << endl; } void check(int&& x) { cout << "received rvalue" << endl; } template<typename T> void without_forward(T&& arg) { check(arg); } template<typename T> void with_forward(T&& arg) { check(forward<T>(arg)); } int main() { without_forward(42); with_forward(42); return 0; }

Результат выполнения кода:

"received lvalue" "received rvalue"

Смотрите также

  • функция move,
    которая преобразует значение в rvalue-ссылку
  • шаблон decay,
    который удаляет ссылки и cv-квалификаторы
  • шаблон remove_reference,
    который удаляет ссылку из типа
  • шаблон declval,
    который возвращает rvalue-ссылку для использования в выражениях
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить