C++ Academy · leksjon

Rvalue-referanser og &&-syntaksen

Knytt Dem til midlertidige objekter med rvalue-referanser for effektiv overføring av ressurser.

Leksjon 2 av 413 trinn

Rvalue-referanser og &&-syntaksen er en gratis leksjon i C++ Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C++ Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C++ Academy inneholder totalt 4 leksjoner.

&&-syntaksen

En rvalue-referanse deklareres med T&&. Den bindes bare til rvalue-er – midlertidige verdier som snart skal ødelegges.

int&& ref = 42;          // OK: binds to literal
int x = 10;
// int&& bad = x;        // ERROR: x is an lvalue

Hvorfor bruke rvalue-referanser?

De gjør det mulig å skrive funksjoner som vet at argumentet snart skal ødelegges. Ressursene kan tas over uten å lage en kopi.

Funksjonsoverlagring etter referansetype

En funksjon kan overlagres for både T& og T&&. Kompilatoren velger riktig variant basert på argumentets kategori.

void process(std::string& s) { std::cout << "lvalue\n"; }
void process(std::string&& s) { std::cout << "rvalue\n"; }

std::string s = "hi";
process(s);            // lvalue
process("temp");       // rvalue
process(std::move(s)); // rvalue

Navngitte rvalue-referanser blir lvalue-er

Når en rvalue-referanse får et navn, er selve navnet en lvalue – identiteten er dermed fastlagt. Bruk std::move for å gjenopprette rvalue-egenskapen.

void f(std::string&& s) {
    // inside f, the parameter s is an lvalue
    g(s);              // passes s by lvalue
    h(std::move(s));   // passes s as an rvalue
}

std::move er en cast

std::move(x) flytter ikke noe i seg selv – det er en typekonvertering som returnerer x som en rvalue-referanse. Selve flyttingen skjer i konstruktøren som mottar verdien.

// equivalent to
static_cast<std::string&&>(s)

Hvorfor det kalles move

Navnet gjenspeiler den typiske bruken – å sende et objekt som det er meningen at ressursene skal stjeles fra – men operasjonen overfører ikke noe på egen hånd.

Universelle referanser (videresendingsreferanser)

Når T&& vises i en mal med dedusert T, er det en videresendingsreferanse – den bindes til både lvalue-er og rvalue-er og bevarer kategorien.

template <typename T>
void wrapper(T&& arg) {
    process(std::forward<T>(arg));
}

Referansekollapsing

Når referanser kombineres gjennom maler, slår språket dem sammen:

  • T& & → T&
  • T& && → T&
  • T&& & → T&
  • T&& && → T&&

Når move ikke bør brukes

For typer som kan kopieres trivielt (int, double, peker) er move det samme som copy. Å kalle std::move gir ingen fordel og kan forvirre leseren.

Move uten å eie ressurser

For typer uten heap-ressurser er flyttekonstruktøren den samme som kopikonstruktøren. Move er bare nyttig for typer som eier dynamisk minne.

Vanlig fallgruve: Flytting fra const

std::move på et const-objekt gjør ingenting – flyttekonstruktøren kan ikke kalles på en const-verdi, fordi den måtte ha endret kilden.

Kort sjekk

Hva gjør std::move(x) egentlig?

Oppsummering

T&& bindes til rvalue-er. Navngitte rvalue-referanser blir lvalue-er – bruk std::move for å gjenopprette rvalue-egenskapen. T&& i en mal er en videresendingsreferanse. std::move er en cast; den utfører ikke selve flyttingen.

Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
51
Leksjoner
203

Ofte stilte spørsmål

Er leksjonen «Rvalue-referanser og &&-syntaksen» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien C++ Academy, inkludert «Rvalue-referanser og &&-syntaksen», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i C++ Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Rvalue-referanser og &&-syntaksen»?

Knytt Dem til midlertidige objekter med rvalue-referanser for effektiv overføring av ressurser. Du øver på C++ Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C++ Academy?

Ingen tidligere erfaring er nødvendig. C++ Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Rvalue-referanser og &&-syntaksen»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C++ Academy-leksjonen?

Ja. Alle C++ Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Lvalue kontra rvalue – forskjellen
  2. Rvalue-referanser og &&-syntaksen
  3. std::move og std::forward
  4. Flyttekonstruktører og flyttetilordning
← Tilbake til C++ Academy