Наиболее распространенное использование 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) здесь необходима, и прецедент для него.