以下のコードでは、 is_rvalue_reference
true を返します。testRef(int &&)
私は呼び出されることを期待していますが、そうではありませんtestRef(int &)
(少なくとも私の Visual Studio 2015 コンパイラでは)。
理由について何か考えはありますか?
void testRef( int&& i )
{
cout << "called testRef(int&&) " << endl;
}
void testRef( int& i )
{
cout << "called testRef(int&) " << endl;
}
int main()
{
int && rvalref = 4;
cout << "is rval? : " << std::is_rvalue_reference<decltype( rvalref )>() << endl;
testRef( rvalref );
}
これは右辺値参照は左辺値として扱われますか?の質問とは異なることに注意してください。
その投稿では、彼らは関数内の変数について話している: それは、私の例で変数 i が右辺値か左辺値かを尋ねるようなものです (答えは、どちらの場合も左辺値であるということです。両方の場合にアドレスがあるからです) )。
右辺値へのキャストである右辺値と を持つことの全体的なポイントはstd::move
、関数とコンストラクターで適切なオーバーロードを選択できるようにすることです。たとえば、次のケースはいずれも への呼び出しに解決されますtestRef(int && i)
。
int main()
{
int g = 3;
testRef(std::move(g));
testRef(4);
}
しかし、右辺値参照ではそうではないようです。