0Pricing
C++ Academy · Lektion

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 reference

Rvalues

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 rvalue

Warum 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 literal

Bindungsregeln

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 ref

Warum 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

  1. Lvalue vs. Rvalue: der Unterschied
  2. Rvalue-Referenzen und die &&-Syntax
  3. std::move und std::forward
  4. Move-Konstruktoren und Move-Zuweisung
← Zurück zu C++ Academy