15

オーバーロードする 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<>のキャストを返すのでしょうか?xT&&

4

1 に答える 1