auto &&は何をするのですか?

これはC ++のコードです11 Notes Sample by Scott Meyers、

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&&

I am having trouble understanding auto&&.
I have some understanding of auto, from which I would say that auto& a1 = x should make type of a1 as int&

引用符で囲まれたコードのどちらが間違っているようですか。

私はこの小さなコードを書いて、gccの下を走った。

#include 

using namespace std;

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

Output = 4 (newline) 5
Then I modified line 8 as auto&& a1 = x;, and ran. Same output.

My question : Is auto& equal to auto&&?
If they are different what does auto&& do?

35
auto && 変数は、関数テンプレートの T && パラメータと同じ意味です。
追加された 著者 fredoverflow,
追加された 著者 AJG85,
rhsがlvalueの場合、 auto& auto && は同じだと思います。 rhsがrvalueの場合、 auto&はエラーを返します。
追加された 著者 balki,

1 答え

The code is right. auto&& p = expr means the type of p is T&& where T will be inferred from expr. The && here indicates a rvalue reference, so e.g.

auto&& p = 1;

will infer T == int and thus the type of p is int&&.

しかし、参照はルールに従って崩壊することができます:

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

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

その場合

auto&& p = x;

as x is an lvalue, an rvalue reference cannot be bound to it, but if we infer T = int& then the type of p will become int& && = int&, which is an lvalue reference, which can be bound to x. Only in this case auto&& and auto& give the same result. These two are different though, e.g.

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

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

詳細は C ++ Rvalue References Explained をご覧ください。

43
追加された
CppNextには同じルールが記載されています: cpp-next.com/archive/2009/12 /先送り
追加された 著者 Nawaz,
ありがとう!説明のために。 Rvalueについてのリンクも参考になります。
追加された 著者 Vinayak Garg,