36

これは、ScottMeyersによるC++11ノートサンプルのコードです。

int x;
auto&& a1 = x;             // x is lvalue, so type of a1 is int&
auto&& a2 = std::move(x);  // std::move(x) is rvalue, so type of a2 is int&&

理解に苦労していますauto&&
私はある程度の理解を持っています、それから私はそれがタイプを作るべきでautoあると言うでしょうauto& a1 = xa1int&

引用されたコードから、これは間違っているようです。

私はこの小さなコードを書き、gccの下で実行しました。

#include <iostream>

using namespace std;

int main()
{
    int x = 4;
    auto& a1 = x;           //line 8
    cout << a1 << endl;
    ++a1;
    cout << x;
    return 0;
}

出力=4 (newline) 5
次に、8行目をとして変更auto&& a1 = x;して実行しました。同じ出力。

私の質問:auto&等しいauto&&
それらが異なる場合、何をしauto&&ますか?

4

1 に答える 1

44

コードは正しいです。はのauto&& p = expr型がpから推論されることを意味します。here は右辺値参照を示します。たとえば、T&&Texpr&&

auto&& p = 1;

は推論するT == intので、の型はpisint&&です。

ただし、参照はルールに従って折りたたむことができます。

T& &   == T&
T& &&  == T&
T&& &  == T&
T&& && == T&&

(この機能は、C++11 で完全転送を実装するために使用されます。)

その場合

auto&& p = x;

左辺値でxあるため、右辺値参照をそれにバインドすることはできませんが、推論するとT = int&、 の型はpになりますint& && = int&。これは、左辺値参照であり、 にバインドできますx。この場合のみauto&&auto&同じ結果が得られます。ただし、これら2つは異なります。たとえば、

auto& p = std::move(x);

std::move(x)は右辺値であり、左辺値参照をそれにバインドできないため、正しくありません。

ウォークスルーについては、C++ Rvalue References Explainedをお読みください。

于 2012-02-06T15:56:11.330 に答える