Avatar ·

¿Qué son rvalue, lvalue, xvalue, glvalue y prvalue en C++11?

Estoy aprendiendo C++11 y me encontré con términos nuevos: rvalue, lvalue, xvalue, glvalue y prvalue. Antes, en el C++ antiguo, pensaba que todo era simple: lvalue es lo que está a la izquierda de la asignación (por ejemplo, una variable), y rvalue es lo que está a la derecha (por ejemplo, el número 42). Pero con la llegada de la semántica de movimiento y std::move, todo se volvió confuso. Por ejemplo, escribí este código: ```cpp int x = 10; // x — lvalue, 10 — prvalue int&& rref = std::move(x); // ¿Qué es std::move(x)? ¿Y rref? int y = x + 5; // (x + 5) — ¿qué es? ``` He oído que hay cinco categorías, pero no entiendo cómo distinguirlas en la práctica. En la documentación hablan sobre "identidad" y "movibilidad", pero necesito ejemplos simples. ¿Por qué std::move(x) devuelve un rvalue, aunque x sea un lvalue? ¿Y qué es un xvalue? Explíquenlo, por favor, para un principiante, con ejemplos de código. Me parece que esto es importante para entender la move-semántica y la perfect forwarding. ¡Agradecería un análisis detallado!