1

以下のコードでは、 is_rvalue_referencetrue を返します。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);
}

しかし、右辺値参照ではそうではないようです。

4

1 に答える 1

1

rvalrefオブジェクトの識別子です。オブジェクトの識別子は常に左辺値です。

式には参照型がありません。式rvalrefには型intと値のカテゴリ "lvalue" があります。

宣言int && rvalrefでは、 が&&どのrvalrefように初期化されるか (つまり、新しいオブジェクトを作成するのではなく、別の式で示されるオブジェクトに新しい名前を追加することによって) を記述し、それだけです。

式では、名前がそのオブジェクトに与えられた最初の名前であるかどうかにかかわらず、オブジェクトの名前の動作は同じです。

このコードdecltype(identifier)は、 と比較して特別な動作をしdecltype(general_expression)ます。その識別子で構成される式の型と値のカテゴリは指定しません。コードdecltype((identifier))はそれを行います。参考文献

于 2017-02-05T03:12:59.423 に答える