Rvalue- og Lvalue-referanser
Sveip for å vise menyen
Begrepene lvalue og rvalue brukes for å klassifisere uttrykk i to typer: de som har en stabil plassering i minnet og de som er midlertidige.
En lvalue (venstreverdi) er et uttrykk som refererer til en spesifikk plassering i minnet. Enkelt sagt er det en variabel med et navn som kan endres.
int x = 10;
Her er x en lvalue fordi den har et navn, eksisterer i minnet, og verdien kan endres (x = 20).
En rvalue (høyreverdi) er en midlertidig verdi som ikke har sitt eget navn og kun eksisterer under evalueringen av et uttrykk.
10
x + 5
int y = x + 5;
Her er x + 5 en rvalue fordi det kun er resultatet av en beregning, ikke lagret som et eget objekt, og kan ikke endres direkte.
Enkel forklaring:
- lvalue: noe med et navn og en minneadresse (en variabel);
- rvalue: et midlertidig resultat (en verdi eller et uttrykk).
Midlertidige verdier
En midlertidig verdi er et kortvarig, mellomliggende resultat opprettet under evalueringen av et uttrykk.
rvalue.h
12345678// `(27 + 6 + 3 + 2)` is a tempopary value int sum = 27 + 6 + 3 + 2; // `static_cast<float>(sum)` is a tempopary value float avarage = static_cast<float>(sum) / count; // std::max(7, 9) will return a tempopary value int largest = std::max(7, 9);
Midlertidige verdier håndteres automatisk av kompilatoren, og de eksisterer i løpet av uttrykket eller operasjonen der de blir opprettet. Etter dette blir de vanligvis forkastet, og resultatet lagres i målvariabelen eller brukes etter behov.
Flyttesemantikk
En rvalue-referanse angis med dobbelt ampersand (&&).
Den eneste forskjellen mellom en lvalue- og en rvalue-referanse er at rvalue kan bindes til et midlertidig objekt, mens en lvalue-referanse ikke kan det.
int&& ref_value = 5 * 5;
Å bruke en rvalue-referanse i denne sammenhengen er kanskje ikke særlig praktisk, siden det ikke gir noen fordel å bruke en rvalue-referanse for en enkel literal.
En kombinasjon av lvalue- og rvalue-referanser brukes for å støtte move-semantikk, slik at ressurser kan overføres fra ett objekt til et annet uten unødvendig kopiering. Se eksempelet nedenfor:
swap.h
123456std::string swap(std::string& a, std::string& b) { std::string tmp(a); // We have two copies of string `a` a = b; // Now we have two copies of string `b` b = tmp; // And now we have two copies of string `tmp` }
Men vi trenger ikke kopier av a eller b. Vi ønsket bare å bytte dem. La oss prøve igjen.
main.cpp
1234567891011121314151617181920212223#include <iostream> void swap(std::string &a, std::string &b) { // Move the content of a into temp std::string temp(std::move(a)); // Move the content of b into a a = std::move(b); // Move the content of temp into b b = std::move(temp); } int main() { std::string a = "Hello\n"; std::string b = "Bye\n"; swap(a, b); std::cout << a << b; }
std::move(): omgjør en lvalue til en rvalue-referanse, muliggjør flyttesemantikk og overføring av eierskap uten kopiering.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår