Что делает auto &&? - PullRequest
       5

Что делает auto &&?

35 голосов
/ 06 февраля 2012

Это код из С ++ 11 Notes Sample Скотта Мейерса,

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 = x должен сделать тип a1 как int&

Что из цитируемого кода кажется неправильным.

Я написал этот небольшой код и работал под 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&&?

1 Ответ

43 голосов
/ 06 февраля 2012

Код правильный.auto&& p = expr означает, что тип p равен T&&, где T будет выведено из expr.&& здесь указывает ссылку на значение r, поэтому, например,

auto&& p = 1;

будет выводить T == int и, таким образом, тип p равен int&&.

Однако ссылки могут бытьсвернуто в соответствии с правилом:

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

(Эта функция используется для реализации совершенной пересылки в C ++ 11.)

В случае

auto&& p = x;

какx является lvalue, ссылка на rvalue не может быть привязана к нему, но если мы выведем T = int&, тогда тип p станет int& && = int&, который является ссылкой lvalue, который может быть привязан к x,Только в этом случае auto&& и auto& дают одинаковый результат.Эти два отличны, хотя, например,

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

неверно, потому что std::move(x) является rvalue, и ссылка на lvalue не может быть привязана к нему.

Пожалуйста, прочитайте C ++ Rvalue ReferencesОбъяснил на прогулку.

...