Функция 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-ссылку для использования в выражениях