O que são rvalue, lvalue, xvalue, glvalue e prvalue em C++11?
Estou estudando C++11 e me deparei com novos termos: rvalue, lvalue, xvalue, glvalue e prvalue. Antes, no C++ antigo, eu achava que era simples: lvalue é o que está à esquerda da atribuição (por exemplo, uma variável), e rvalue é o que está à direita (por exemplo, o número 42). Mas com o surgimento da semântica de movimento e std::move, tudo ficou confuso.
Por exemplo, escrevi este código:
```cpp
int x = 10; // x — lvalue, 10 — prvalue
int&& rref = std::move(x); // O que é std::move(x)? E rref?
int y = x + 5; // (x + 5) — o que é isso?
```
Ouvi dizer que existem cinco categorias, mas não entendo como diferenciá-las na prática. Na documentação falam sobre "identidade" e "capacidade de movimento", mas preciso de exemplos simples. Por que std::move(x) retorna um rvalue, embora x seja lvalue? E o que é xvalue? Explique, por favor, para um iniciante, com exemplos de código.
Acho que isso é importante para entender a move-semântica e perfect forwarding. Agradeço por uma análise detalhada!
<<>>