Lvalue frente a rvalue: la diferencia
Razone sobre las categorías de valor: lvalues, prvalues y xvalues.
Lvalue frente a rvalue: la diferencia es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.
Dos mundos: lvalue y rvalue
Toda expresión de C++ es un lvalue (algo con nombre y dirección) o un rvalue (un temporal sin nombre).
Lvalues
Un lvalue hace referencia a un objeto persistente; puede obtener su dirección con &.
int x = 42; // x is an lvalue
int* p = &x; // taking the address of an lvalue
int& r = x; // r is an lvalue referenceRvalues
Un rvalue es un temporal: literales, valores devueltos por funciones y expresiones como a + b. No se puede obtener su dirección.
int a = 5, b = 3;
int c = a + b; // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvaluePor qué importa la distinción
Un rvalue está a punto de destruirse. Podemos apropiarnos de sus recursos de forma segura en lugar de copiarlos; esa es la base de la semántica de movimiento.
Tres categorías desde C++11
El C++ moderno perfecciona este modelo:
- lvalue: tiene nombre e identidad
- prvalue (rvalue puro): un temporal puro (un literal o un valor devuelto)
- xvalue (en expiración): está a punto de destruirse (el resultado de
std::move)
Referencias lvalue frente a rvalue
Una referencia lvalue usa &; una referencia rvalue usa &&.
int x = 10;
int& lr = x; // lvalue reference
int&& rr = 42; // rvalue reference, binds to literalReglas de vinculación
Compatibilidad de tipos:
- una referencia lvalue (
T&) se vincula a lvalues - una referencia lvalue constante (
const T&) se vincula a ambos - una referencia rvalue (
T&&) se vincula únicamente a rvalues y xvalues
Comprobar con decltype
Puede preguntar al compilador a qué categoría pertenece una expresión usando decltype sobre ella.
int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue refPor qué C++11 añadió referencias rvalue
Para permitir la semántica de movimiento: un constructor que recibe T&& puede apropiarse de los datos internos de un temporal, evitando una copia profunda.
Error habitual: una referencia rvalue con nombre es un lvalue
Una variable de referencia rvalue, una vez declarada, tiene un nombre, lo que la convierte en un lvalue. Para pasarla como rvalue, use std::move.
void f(std::string&& s) {
// s here is an lvalue!
process(std::move(s)); // now it is an rvalue again
}Introducción al reenvío perfecto
Las plantillas que reciben T&& deducen una referencia lvalue o rvalue. Combinadas con std::forward, pueden conservar la categoría de valor; esto se explicará en detalle más adelante.
Comprobación rápida
¿Cuál de estas expresiones es un rvalue?
Resumen
Un lvalue tiene nombre y dirección; un rvalue es un temporal. T& se vincula a lvalues y T&& se vincula a rvalues. Esta distinción permite la semántica de movimiento y evita copias innecesarias de temporales.
Preguntas frecuentes
¿La lección «Lvalue frente a rvalue: la diferencia» es gratis?
Sí — el texto completo de «Lvalue frente a rvalue: la diferencia» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Lvalue frente a rvalue: la diferencia»?
Razone sobre las categorías de valor: lvalues, prvalues y xvalues. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C++ Academy?
No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Lvalue frente a rvalue: la diferencia»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C++ Academy?
Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Lvalue frente a rvalue: la diferencia
- Referencias rvalue y sintaxis &&
- std::move y std::forward
- Constructores de movimiento y asignación de movimiento