Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Rvalue- og Lvalue-referencer | Section
C++ Pointers og Referencer

bookRvalue- og Lvalue-referencer

Stryg for at vise menuen

Begreberne lvalue og rvalue relaterer sig til klassificeringen af udtryk.

  • lvalue eller venstreværdi: et udtryk, der refererer til et objekt med en identificerbar hukommelsesplacering. Repræsenterer et objekt, der kan ændres;

  • rvalue eller højreværdi: et udtryk, der repræsenterer en midlertidig eller engangsværdi.

Midlertidige værdier

En midlertidig værdi er et kortvarigt, mellemliggende resultat skabt under evalueringen af et udtryk.

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 værdier håndteres automatisk af compileren og eksisterer i varigheden af det udtryk eller den operation, hvor de er oprettet. Derefter bliver de typisk kasseret, og resultatet gemmes i målvariablen eller bruges efter behov.

Flyttesemantik

En rvalue-reference angives med dobbelt ampersand (&&).

Den eneste forskel mellem en lvalue- og rvalue-reference er, at en rvalue kan bindes til et midlertidigt objekt, mens en lvalue-reference ikke kan.

int&& ref_value = 5 * 5;
Note
Bemærk

Brug af en rvalue-reference i denne sammenhæng er måske ikke særlig praktisk, da der ikke er nogen fordel ved at bruge en rvalue-reference til et simpelt literal.

En kombination af lvalue- og rvalue-referencer bruges til at understøtte move-semantik, hvilket gør det muligt at overføre ressourcer fra ét objekt til et andet uden unødvendig kopiering. Se eksemplet 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 har ikke brug for kopier af a eller b. Vi ønskede blot at bytte dem. Lad os prøve igen.

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(): omdanner en lvalue til en rvalue reference, muliggør move-semantik og overførsel af ejerskab uden kopiering.

question mark

Hvad er en lvalue?

Vælg det korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 10

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 1. Kapitel 10
some-alt