¿Qué son rvalues, lvalues, xvalues, glvalues y prvalues en C++?
Empecé a estudiar C++11 y me topé con los términos "lvalue" y "rvalue", pero luego vi que hay más: xvalue, glvalue, prvalue. Estoy confundido.
En el C++ antiguo entendía que lvalue es lo que está a la izquierda de la asignación (por ejemplo, una variable), y rvalue lo que está a la derecha (por ejemplo, el número 5). Pero en C++11 aparecieron la move-semántica y std::move, y ahora no entiendo a qué categoría pertenece la expresión std::move(x). ¿Es lvalue o rvalue? ¿Y por qué se habla de "categorías de valores"?
Aquí hay un ejemplo que me confunde:
```cpp
int x = 10; // x - lvalue
int y = x + 5; // x+5 - rvalue
int&& z = std::move(x); // ¿Qué es std::move(x)?
```
He oído que hay 5 categorías: lvalue, rvalue, xvalue, glvalue, prvalue. ¿Pueden explicarlas en palabras simples con ejemplos? ¿Y cómo se relacionan con la move-semántica y los objetos temporales?