2012-02-06 12 views
35

Jest to kod z C++ 11 Uwagi próbki przez Scott Meyers,Co robi auto &&?

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

mam problemy ze zrozumieniem auto&&.
mam pewne zrozumienie auto, z której chciałbym powiedzieć, że auto& a1 = x powinny typ a1 jak int&

Które z kodu cytowane wydaje się błędne.

Napisałem ten mały kod i uruchomiłem pod GCC.

#include <iostream> 

using namespace std; 

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

wyjściowy = 4 (newline) 5
Następnie zmodyfikowaną linię 8, jak auto&& a1 = x; i ran. Ten sam wynik.

Moje pytanie: czy auto& jest równe auto&&?
Jeśli są inne, co robi auto&&?

+4

Myślę, że 'auto &' i 'auto &&' są równoważne, jeśli rhs jest lwartością. 'auto &' da ci błąd, jeśli rhs jest wartością r. – balki

+0

[Odwołania do wartości L i odwołania do wartości r są podobne] (http://msdn.microsoft.com/en-us/library/f90831hc.aspx) – AJG85

+4

Zmienna 'auto &&' oznacza to samo, co parametr 'T && 'w szablonie funkcji . – fredoverflow

Odpowiedz

43

Kod jest prawidłowy. auto&& p = expr oznacza typ p to T&&, gdzie T zostanie wywnioskowane z expr. Tutaj && wskazuje referencję rwartości, czyli np.

auto&& p = 1; 

zinterpretuje T == int, a tym samym typ p jest int&&.

Jednakże odniesienia może być złożona, zgodnie z zasadą:

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

(. Funkcja ta jest wykorzystywana do wdrażania doskonałe przekazywanie C++ 11)

W przypadku

auto&& p = x; 

jako jest lwartością, referencja rvalue nie może być z nim powiązana, ale jeśli wnioskujemy T = int&, wówczas pojawi się typ p ja int& && = int&, która jest referencją o wartości l, która może być powiązana z x. Tylko w tym przypadku auto&& i auto& dają taki sam wynik. Te dwa są jednak różne, np.

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

jest błędna, ponieważ std::move(x) jest rvalue, a odniesienie lwartość nie może być związana z nim.

Proszę przeczytać C++ Rvalue References Explained na spacer.

+0

CppNext podał tę samą regułę: http://cpp-next.com/archive/2009/12/onward-forward/ – Nawaz

+0

Dzięki! dla wyjaśnienia. Pomocny jest również link o wartości R. –