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 | Seksjon
C++-Pekere og Referanser

bookRvalue- og Lvalue-referanser

Sveip for å vise menyen

Begrepene lvalue og rvalue er knyttet til klassifisering av uttrykk.

  • lvalue eller venstreverdi: et uttrykk som refererer til et objekt med identifiserbar minneplassering. Representerer et objekt som kan endres;

  • rvalue eller høyreverdi: et uttrykk som representerer en midlertidig eller engangsverdi.

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 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(): forvandler en lvalue til en rvalue-referanse, muliggjør flyttesemantikk og overføring av eierskap uten kopiering.

question mark

Hva er en lvalue?

Velg det helt riktige svaret

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 10

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 1. Kapittel 10
some-alt