Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Rvalue- og Lvalue-referanser | Referansegrunnlag
C++-Pekere og Referanser

bookRvalue- 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

rvalue.h

copy
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;
Note
Merk

Å 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

swap.h

copy
123456
std::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

main.cpp

copy
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.

question mark

Hva er en lvalue?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 3. Kapittel 2
some-alt