Según el estándar de C++1 (traducción mía):
3.10 lvalues
y rvalues
- Las expresiones se categorizan siguiendo la siguiente taxonomía:
- Una lvalue (así llamada por motivos históricos, ya que las lvalues pueden aparecer en el lado izquierdo de una expresión de asignación) designa una función o un objeto. [Ejemplo: si
E
es una expresión de tipo puntero, entonces *E
es una expresión lvalue refiriéndose al objeto o función a la que E
apunta. Como ejemplo adicional, el resultado de llamar a una función cuyo tipo de retorno es una referencia a lvalue es una lvalue. —fin del ejemplo]
- Una xvalue (un valor "en eXpiración") se refiere a un objeto, habitualmente cerca del final de su ciclo de vida (que sus recursos vayan a ser movido, por ejemplo). Una xvalue es el resultado de ciertos tipos de expresiones que implican referencias rvalue. [Ejemplo: El resultado de llamar a una función cuyo tipo de retorno es una referencia rvalue es un xvalue. —fin del ejemplo]
- Una glvalue (lvalue "generalizada") es una lvalue o una xvalue.
- Una rvalue (así llamada por motivos históricos, ya que las rvalues pueden aparecer en el lado derecho de una expresión de asignación) es una xvalue, objeto temporal o subobjeto, también un valor que no está asociado con un objeto.
- Una prvalue (valor del lado derecho "puro") es una rvalue que no es una xvalue. [Ejemplo: El resultado de llamar a una función cuyo tipo de retorno no sea una referencia es una prvalue. El valor de un literal como
12
, 7.3e5
, o true
también es una prvalue. —fin del ejemplo]
Esto nos respondería qué son y cómo se relacionan entre si estas categorías de expresiones. Respecto a si lvalue
y rvalue
son iguales en C++03 y C++11, podemos afirmar que no del todo:
Las lvalue
de C++03 conservan la misma categoría en C++11, mientras que las rvalue
de C++03 son ahora las prvalue
de C++11. En general podemos decir que las rvalue
han evolucionado para tener en cuenta las semánticas de movimiento, lo cuál también responde al por qué son necesarias las nuevas categorizaciones ya que sin ellas, las semánticas de movimiento no serían posibles.
1Esa versión del estándar se publicó a finales de Marzo de 2010.