Наиболее распространенное использование std::forward
заключается в том, чтобы идеально переадресовать перенаправление (универсальную) ссылку, например
template<typename T>
void f(T&& param)
{
g(std::forward<T>(param)); // perfect forward to g
}
Здесь param
- это lvalue
, а std::forward
заканчивается тем, что он присваивает значение rvalue или lvalue, в зависимости от того, что ограничивал его аргумент.
Глядя на определение std::forward
на cppreference.com Я вижу, что существует также rvalue
перегрузка
template< class T >
T&& forward( typename std::remove_reference<T>::type&& t );
Может ли кто-нибудь объяснить мне причину перегрузки rvalue
? Я не вижу никакого варианта использования. Если вы хотите передать значение r функции, вы можете просто передать его как есть, не нужно применять std::forward
на нем.
Это отличается от std::move
, где я вижу, почему нужно также перегружать rvalue
: вы можете иметь дело с общим кодом, в котором вы не знаете, что вам передается, и вы хотите безоговорочную поддержку для перемещения семантики, см., например, Почему std:: move принимает универсальную ссылку?.
EDIT Чтобы прояснить вопрос, я спрашиваю, почему перегрузка (2) здесь необходима, и прецедент для него.