c++ - programming - stackoverflow surveys
¿Qué significa auto && do? (1)
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 pueden colapsarse de acuerdo con la regla:
T& & == T&
T& && == T&
T&& & == T&
T&& && == T&&
(Esta característica se usa para implementar el reenvío perfecto en C ++ 11).
En el caso
auto&& p = x;
como x
es un lvalor, no se puede vincular una referencia rvalue, pero si inferimos T = int&
luego el tipo de p
se convertirá en 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, por ejemplo
auto& p = std::move(x);
es incorrecto porque std::move(x)
es un valor r, y la referencia lvalue no puede vincularse a él.
Por favor, lea las referencias de C ++ Rvalue explicadas para un recorrido.
Este es el código de C ++ 11 Notes Sample de 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&&
Tengo problemas para entender el auto&&
Tengo un poco de comprensión de auto
, de lo cual yo diría que auto& a1 = x
debería hacer el tipo de a1
como int&
Que a partir del código entre comillas parece incorrecto.
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;
}
Salida = 4 (newline) 5
Luego modifiqué la línea 8 como auto&& a1 = x;
, y corrió. Mismo resultado.
Mi pregunta: ¿es auto&
igual que auto&&
?
Si son diferentes, ¿qué hace auto&&
do?