オーバーロードする 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&&