2012-02-06 34 views
35

Este es el código de C++ 11 Notas de la muestra por Scott Meyers,¿Qué significa auto && do?

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

Estoy teniendo problemas para entender auto&&.
que tienen una cierta comprensión de auto, de la que yo diría que debería hacer auto& a1 = x tipo de a1 como int&

que a partir de código Citado, parece mal.

Escribí este pequeño código y corrí bajo gcc.

#include <iostream> 

using namespace std; 

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

de salida = 4 (newline) 5
Entonces modificado la línea 8 como auto&& a1 = x;, y corrió. Mismo resultado.

Mi pregunta es auto& igual a auto&&?
Si son diferentes, ¿qué hace auto&&?

+4

Creo que 'auto &' y 'auto &&' son equivalentes si rhs es un lvalue. 'auto &' le dará un error si rhs es un valor r. – balki

+0

[Las referencias de Lvalue y rvalue son similares] (http://msdn.microsoft.com/en-us/library/f90831hc.aspx) – AJG85

+4

Una variable 'auto &&' significa lo mismo que un parámetro 'T &&' en una plantilla de función . – fredoverflow

Respuesta

43

El código es correcto. auto&& p = expr significa que el tipo de p es T&& donde T se deducirá de expr. El && aquí indica una referencia rvalue, por ejemplo,

auto&& p = 1; 

inferirá T == int y por lo tanto el tipo de p es int&&.

Sin embargo, las referencias se pueden contraer de acuerdo con la regla:

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

(. Esta característica se utiliza para implementar el reenvío perfecto en C++ 11)

En el caso

auto&& p = x; 

como x es un valor l, una referencia rvalue no puede vincularse a ella, pero si inferimos T = int&, entonces el tipo de p será beco me int& && = int&, que es una referencia lvalue, que puede vincularse a x. Solo en este caso auto&& y auto& dan el mismo resultado. Sin embargo, estos dos son diferentes, p.

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

es incorrecta porque std::move(x) es un valor de lado derecho, y la referencia de valor-I no puede estar obligado a ello.

Por favor, lea C++ Rvalue References Explained para un recorrido.

+0

CppNext ha enumerado la misma regla: http://cpp-next.com/archive/2009/12/onward-forward/ – Nawaz

+0

¡Gracias! para la explicación También el enlace sobre Rvalue es útil. –

Cuestiones relacionadas