Пусть функция с именем Y перегружается:
void Y(int& lvalue)
{ cout << "lvalue!" << endl; }
void Y(int&& rvalue)
{ cout << "rvalue!" << endl; }
Теперь давайте определим функцию шаблона, которая действует как std::forward.
template<class T>
void f(T&& x)
{
Y( static_cast<T&&>(x) ); // Using static_cast<T&&>(x) like in std::forward
}
Теперь посмотрим на main()
int main()
{
int i = 10;
f(i); // lvalue >> T = int&
f(10); // rvalue >> T = int&&
}
Как и ожидалось, вывод
lvalue!
rvalue!
Теперь вернитесь к функции шаблона f()
и замените static_cast<T&&>(x)
на static_cast<T>(x)
. Посмотрим на результат:
lvalue!
rvalue!
Это то же самое! Почему? Если они одинаковые, то почему std::forward<>
возвращает приведение от x
к T&&
?