Lvalue vs. Rvalue: der Unterschied
Setzen Sie sich mit Wertkategorien auseinander: lvalues, prvalues und xvalues.
Lvalue vs. Rvalue: der Unterschied ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Zwei Welten: Lvalue und Rvalue
Jeder Ausdruck in C++ ist entweder ein lvalue (ein Element mit Namen und Adresse) oder ein rvalue (ein temporäres Objekt ohne Namen).
Lvalues
Ein lvalue verweist auf ein dauerhaft vorhandenes Objekt – Sie können mit & seine Adresse ermitteln.
int x = 42; // x is an lvalue
int* p = &x; // taking the address of an lvalue
int& r = x; // r is an lvalue referenceRvalues
Ein rvalue ist ein temporäres Objekt – etwa ein Literal, ein Rückgabewert einer Funktion oder ein Ausdruck wie a + b. Seine Adresse kann nicht ermittelt werden.
int a = 5, b = 3;
int c = a + b; // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvalueWarum die Unterscheidung wichtig ist
Ein rvalue wird gleich zerstört. Wir können seine Ressourcen sicher übernehmen, statt sie zu kopieren – das ist die Grundlage der Move-Semantik.
Drei Kategorien seit C++11
Modernes C++ verfeinert das Modell:
- lvalue – hat einen Namen und eine Identität
- prvalue (reiner rvalue) – ein rein temporäres Objekt (ein Literal, eine Rückgabe per Wert)
- xvalue (auslaufender Wert) – steht kurz vor seiner Zerstörung (das Ergebnis von
std::move)
lvalue- und rvalue-Referenzen
Eine lvalue-Referenz verwendet &; eine rvalue-Referenz verwendet &&.
int x = 10;
int& lr = x; // lvalue reference
int&& rr = 42; // rvalue reference, binds to literalBindungsregeln
Typkompatibilität:
- Eine lvalue-Referenz (
T&) bindet an lvalues - Eine const-lvalue-Referenz (
const T&) bindet an beide - Eine rvalue-Referenz (
T&&) bindet nur an rvalues (und xvalues)
Mit decltype prüfen
Sie können den Compiler mithilfe von decltype fragen, welcher Kategorie ein Ausdruck angehört.
int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue refWarum C++11 rvalue-Referenzen eingeführt hat
Um die Move-Semantik zu ermöglichen: Ein Konstruktor, der T&& entgegennimmt, kann die internen Daten eines temporären Objekts übernehmen und so eine tiefe Kopie vermeiden.
Häufiger Fehler: Eine benannte rvalue-Referenz ist ein lvalue
Eine rvalue-Referenzvariable hat nach ihrer Deklaration einen Namen – dadurch ist sie ein lvalue. Um sie als rvalue weiterzugeben, verwenden Sie std::move.
void f(std::string&& s) {
// s here is an lvalue!
process(std::move(s)); // now it is an rvalue again
}Ausblick auf Perfect Forwarding
Templates, die T&& entgegennehmen, leiten entweder eine lvalue- oder eine rvalue-Referenz her. Zusammen mit std::forward können sie die Wertkategorie beibehalten – dies wird später ausführlich behandelt.
Schnelltest
Welcher dieser Ausdrücke ist ein rvalue?
Zusammenfassung
Ein lvalue hat einen Namen und eine Adresse; ein rvalue ist ein temporäres Objekt. T& bindet an lvalues, T&& an rvalues. Diese Unterscheidung ermöglicht die Move-Semantik und vermeidet unnötige Kopien temporärer Objekte.
Häufig gestellte Fragen
Ist die Lektion „Lvalue vs. Rvalue: der Unterschied“ kostenlos?
Ja — der vollständige Text von „Lvalue vs. Rvalue: der Unterschied“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Lvalue vs. Rvalue: der Unterschied“?
Setzen Sie sich mit Wertkategorien auseinander: lvalues, prvalues und xvalues. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Lvalue vs. Rvalue: der Unterschied“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Lvalue vs. Rvalue: der Unterschied
- Rvalue-Referenzen und die &&-Syntax
- std::move und std::forward
- Move-Konstruktoren und Move-Zuweisung