Функция std::forward, наряду с std::move, предназначена для реализации семантики перемещения в C++. Она принимает forwarding-ссылку, по шаблонному параметру T определяет, передана ей lvalue-ссылка или rvalue-ссылка и возвращает ссылку соответствующего типа. Назначение функции std::forward – это реализация механизма идеальной передачи (perfect forwarding). Этот механизм подразумевает, что объекты, переданные в функцию в виде lvalue-выражений, должны копироваться, а объекты, переданные в функцию в виде rvalue-выражений, должны перемещаться.
Дело в том, что если присвоить rvalue-ссылку некоторой переменной ref, то ref будет именованной сущностью, поэтому его категория – lvalue, несмотря на то что тип переменной ref – rvalue-ссылка. Поэтому для ref будет использоваться семантика копирования, а не перемещения.
Функция std::forward решает эту проблему. Рассмотрим следующий пример:
template <typename T>
void foo(T &&arg)
{
std::vector<int> var = arg;
....
}
std::vector<int> vect(1'000'000, 1);
foo(std::move(vect));
В коде происходит следующее:
А теперь воспользуемся std::forward:
template <typename T>
void foo(T &&arg)
{
std::vector<int> var = std::forward<T>(arg);
....
}
std::vector<int> vect(1'000'000, 1);
foo(std::move(vect));
Здесь происходит следующее:
0