Avatar ·

Que sont les rvalues, lvalues, xvalues, glvalues et prvalues en C++ ?

J'ai commencé à étudier C++11 et je suis tombé sur les termes "lvalue" et "rvalue", mais ensuite j'ai vu qu'il y en avait plus : xvalue, glvalue, prvalue. Je suis confus. \n\nDans l'ancien C++, je comprenais qu'une lvalue est ce qui se trouve à gauche d'une affectation (par exemple, une variable), et une rvalue à droite (par exemple, le nombre 5). Mais en C++11, la move-semantics et std::move sont apparus, et maintenant je ne comprends pas à quoi correspond l'expression std::move(x). Est-ce une lvalue ou une rvalue ? Et pourquoi parle-t-on de "catégories de valeurs" ? \n\nVoici un exemple qui me trouble :\n```cpp\nint x = 10; // x - lvalue\nint y = x + 5; // x+5 - rvalue\nint&& z = std::move(x); // Qu'est-ce que std::move(x) ?\n```\nJ'ai entendu dire qu'il y a 5 catégories : lvalue, rvalue, xvalue, glvalue, prvalue. Pouvez-vous les expliquer en termes simples avec des exemples ? Et comment sont-elles liées à la move-semantics ?