C++ Academy · Lektion

Lvalue kontra rvalue – forskellen

Tænk over værdikategorier: lvalues, prvalues og xvalues

Lektion 1 af 413 trin

Lvalue kontra rvalue – forskellen er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

To verdener: lvalue og rvalue

Ethvert udtryk i C++ er enten en lvalue (en ting med et navn og en adresse) eller en rvalue (et midlertidigt objekt uden navn).

lvalues

En lvalue refererer til et vedvarende objekt — du kan tage dets adresse med &.

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

En rvalue er et midlertidigt objekt — literaler, funktionsreturværdier og udtryk som a + b. Du kan ikke tage adressen på det.

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

Hvorfor skelnen er vigtig

En rvalue er ved at blive destrueret. Vi kan sikkert stjæle dens ressourcer i stedet for at kopiere dem — det er grundlaget for flyttesemantik.

Tre kategorier siden C++11

Moderne C++ nuancerer modellen:

  • lvalue — har et navn og en identitet
  • prvalue (ren rvalue) — et rent midlertidigt objekt (en literal, en returværdi)
  • xvalue (udløbende) — er ved at forsvinde (resultatet af std::move)

lvalue- og rvalue-referencer

En lvalue-reference bruger &, mens en rvalue-reference bruger &&.

int x = 10;
int&  lr = x;        // lvalue reference
int&& rr = 42;       // rvalue reference, binds to literal

Bindingsregler

Typekompatibilitet:

  • lvalue-reference (T&) bindes til lvalues
  • const lvalue-reference (const T&) bindes til begge
  • rvalue-reference (T&&) bindes kun til rvalues (og xvalues)

Tjek med decltype

Du kan spørge compileren, hvilken kategori et udtryk tilhører, ved at bruge decltype på det.

int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue ref

Hvorfor C++11 tilføjede rvalue-referencer

For at muliggøre flyttesemantik: En konstruktør, der tager T&&, kan overtage et midlertidigt objekts interne data og dermed undgå en dyb kopi.

Almindelig fejl: En navngiven rvalue-reference er en lvalue

En rvalue-referencevariabel har et navn, når den først er deklareret — derfor er den en lvalue. Brug std::move for at videregive den som en rvalue.

void f(std::string&& s) {
    // s here is an lvalue!
    process(std::move(s));   // now it is an rvalue again
}

Forhåndsvisning af perfekt videresendelse

Skabeloner, der tager T&&, deducerer enten en lvalue-reference eller en rvalue-reference. Kombineret med std::forward kan de bevare værdikategorien — det gennemgås mere detaljeret senere.

Hurtigt tjek

Hvilket af disse udtryk er en rvalue?

Opsummering

En lvalue har et navn og en adresse, mens en rvalue er et midlertidigt objekt. T& bindes til lvalues, og T&& bindes til rvalues. Denne skelnen muliggør flyttesemantik og undgår unødvendige kopier af midlertidige objekter.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Lvalue kontra rvalue – forskellen” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Lvalue kontra rvalue – forskellen”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Lvalue kontra rvalue – forskellen”?

Tænk over værdikategorier: lvalues, prvalues og xvalues Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Lvalue kontra rvalue – forskellen”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Lvalue kontra rvalue – forskellen
  2. Rvalue-referencer og &&-syntaksen
  3. std::move og std::forward
  4. Flyttekonstruktører og flyttetildeling
← Tilbage til C++ Academy