Lvalue kontra rvalue – forskellen
Tænk over værdikategorier: lvalues, prvalues og xvalues
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 referencervalues
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 rvalueHvorfor 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 literalBindingsregler
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 refHvorfor 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.
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
- Lvalue kontra rvalue – forskellen
- Rvalue-referencer og &&-syntaksen
- std::move og std::forward
- Flyttekonstruktører og flyttetildeling