Avatar ·

Was sind rvalues, lvalues, xvalues, glvalues und prvalues in C++?

Ich habe angefangen, C++11 zu lernen, und bin auf die Begriffe "lvalue" und "rvalue" gestoßen, aber dann habe ich gesehen, dass es noch mehr gibt: xvalue, glvalue, prvalue. Ich bin verwirrt. \n\nIm alten C++ habe ich verstanden, dass ein lvalue das ist, was links von einer Zuweisung steht (z.B. eine Variable), und ein rvalue das, was rechts steht (z.B. die Zahl 5). Aber in C++11 kamen move-Semantik und std::move hinzu, und jetzt verstehe ich nicht, zu welcher Kategorie der Ausdruck std::move(x) gehört. Ist das ein lvalue oder ein rvalue? Und warum spricht man von "Wertkategorien"? \n\nHier ist ein Beispiel, das mich verwirrt:\n```cpp\nint x = 10; // x - lvalue\nint y = x + 5; // x+5 - rvalue\nint&& z = std::move(x); // Was ist std::move(x)?\n```\nIch habe gehört, dass es 5 Kategorien gibt: lvalue, rvalue, xvalue, glvalue, prvalue. Könnt ihr sie einfach mit Beispielen erklären? Und wie hängen sie mit der move-Semantik zusammen?