Lvalue y rvalue en C y C ++

Una definición simple

Esta parte primero da una definición simple de lvalue y rvalue. El artículo se describirá en detalle a continuación.
Generación de lvalue (valor del localizador).

Valor izquierdo, valor derecho

  En C ++ 11, todos los valores deben pertenecer a uno de los valores izquierdo y derecho, y los valores correctos se pueden subdividir en valores derechos puros y valores muertos. En C ++ 11, los que pueden tomar direcciones y tener nombres son valores l, por el contrario, los que no pueden tomar direcciones y no tienen nombres son valores r (valores de muerte o valores r puros). El lvalue representa un objeto que ocupa una determinada posición en la memoria (en otras palabras, tiene una dirección). Por ejemplo, int a = b + c, a es el lvalue, y su nombre de variable es a, que se puede obtener mediante & a La dirección de la variable; el valor de retorno de la expresión b + cy la función int func () es un rvalue. Antes de que se asigne a una variable, no podemos encontrarla por el nombre de la variable. Una operación como & ( b + c) No se compilará.

Valor correcto, valor muerto

  En C ++ 11, los valores r se dividen en valores r puros (valor pr, valor R puro) y valores x (valor eXpiring). El concepto de rvalue puro se refiere a variables temporales y valores literales que no están asociados con objetos; el valor muerto es una nueva expresión relacionada con referencias de rvalue en C ++ 11, por lo que la expresión generalmente se moverá Objetos de (movido para otros usos), como el valor de retorno de la función que devuelve la referencia rvalue T &&, el valor de retorno de std :: move, o el valor de retorno de la función de conversión de tipo convertida a T &&.

  El valor muerto puede entenderse como el valor obtenido al "robar" el espacio de memoria de otras variables. Cuando se garantiza que otras variables ya no se utilizan o están a punto de ser destruidas, la liberación y asignación de espacio de memoria se puede evitar "robando" y se puede prolongar la vida útil del valor de la variable.

Referencia de lvalue, referencia de rvalue

  Una referencia lvalue es un tipo que hace referencia a un lvalue. Una referencia rvalue es un tipo de referencia a un rvalue, de hecho, dado que un rvalue generalmente no tiene nombre, solo podemos encontrar su existencia por referencia.

  Tanto las referencias rvalue como las referencias lvalue pertenecen a tipos de referencia. Ya sea que declare una referencia lvalue o una referencia rvalue, debe inicializarla inmediatamente. La razón puede entenderse como que el tipo de referencia en sí mismo no posee la memoria del objeto vinculado, sino que es solo un alias del objeto. Las referencias de lvalue son alias para valores de variables con nombre y las referencias de rvalue son alias para variables sin nombre (anónimas).

  Las referencias de lvalue normalmente no pueden estar vinculadas a rvalues, pero las referencias de lvalue constantes son un tipo de referencia "universal". Puede aceptar lvalue no constante, lvalue constante y rvalue para inicializarlo. Sin embargo, el rvalue al que hace referencia la constante lvalue solo puede ser de solo lectura durante el resto de su vida. Por el contrario, un valor l no constante solo puede aceptar un valor l no constante para inicializarlo.

 

int &a = 2;       # 左值引用绑定到右值,编译失败
int b = 2;        # 非常量左值
const int &c = b; # 常量左值引用绑定到非常量左值,编译通过
const int d = 2;  # 常量左值
const int &e = c; # 常量左值引用绑定到常量左值,编译通过
const int &b =2;  # 常量左值引用绑定到右值,编程通过

  Por lo general, una referencia rvalue no se puede vincular a ningún lvalue. Si desea vincular un lvalue a una referencia rvalue, generalmente necesita std :: move () para convertir el lvalue en un rvalue, por ejemplo:

int a;
int &&r1 = c;             # 编译失败
int &&r2 = std::move(a);  # 编译通过

  La siguiente tabla enumera los tipos de valores a los que pueden hacer referencia varios tipos de referencia en C ++ 11. Vale la pena señalar que siempre que se pueda vincular el tipo de referencia del rvalue, se puede extender la vida del rvalue.

Supongo que te gusta

Origin blog.csdn.net/sunlin972913894/article/details/104023377
Recomendado
Clasificación