10

Como continuación de la pregunta "Diferencias entre Rvalue y Lvalue" y basado en la pregunta "What are rvalues, lvalues, xvalues, glvalues, and prvalues?".


En C++03, una expresión podía ser rvalue o lvalue.

A partir de C++11, se añadieron tres nuevas categorías, siendo la lista completa de categorías:

  1. rvalue: Valor del lado derecho (right value).
  2. lvalue: Valor del lado izquierdo (left value).
  3. xvalue: Valor en expiración (expiring value).
  4. glvalue: Valor del lado izquierdo generalizado (generalized left value).
  5. prvalue: Valor del lado derecho puro (pure right value).

De dos categorías hemos pasado a cinco.

  • ¿Qué son estas nuevas categorías de expresiones?
  • ¿Cómo se relacionan con las rvalue y lvalue que existían anteriormente?
  • ¿Son las rvalue y lvalue de C++03 lo mismo que en C++11?
  • ¿Por qué son necesarias estas categorías?

¿Acaso el comité de estándares tan sólo intenta confundirnos?

Mariano
  • 23,777
  • 20
  • 70
  • 102
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Yo casi pondría también las etiquetas C++14 (creo que no existe) y C++1Z (que habría que ir renombrándola a C++17) – eferion Apr 07 '17 at 11:27
  • @eferion gracias, lo olvidé. Como no me permitía aceptar la respuesta tras la publicación lo dejé ahí olvidado :'( – PaperBirdMaster Apr 24 '17 at 08:19
  • Si es normal, solo que como pasé por aquí pensé que sería buena idea mandar un recordatorio – eferion Apr 24 '17 at 08:20
  • @PaperBirdMaster La etiqueta [tag:expresión] me está trayendo problemas con usuarios que la quieren usar para regex (escriben "expresión" y un espacio). ¿Crees que se podría acotar con otro nombre más específico, sea `c++-expresión`, `expresión-de-c++`, `expresiones-rvalue-lvalue`, o similar? – Mariano Nov 17 '17 at 14:14
  • @Paula_plus_plus estoy eliminando la etiqueta [tag:expresión] de la pregunta. – Mariano Apr 12 '18 at 15:28

1 Answers1

7

Según el estándar de C++1 (traducción mía):

3.10 lvalues y rvalues

  1. 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.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82