Rvalue-referanser og &&-syntaksen
Knytt Dem til midlertidige objekter med rvalue-referanser for effektiv overføring av ressurser.
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 lvalueHvorfor 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)); // rvalueNavngitte 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.
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
- Lvalue kontra rvalue – forskjellen
- Rvalue-referanser og &&-syntaksen
- std::move og std::forward
- Flyttekonstruktører og flyttetilordning