Rvalue- og Lvalue-referencer
Stryg for at vise menuen
Begreberne lvalue og rvalue relaterer sig til klassificeringen af udtryk.
-
lvalueeller venstreværdi: et udtryk, der refererer til et objekt med en identificerbar hukommelsesplacering. Repræsenterer et objekt, der kan ændres; -
rvalueeller 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
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;
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
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 har ikke brug for kopier af a eller b. Vi ønskede blot at bytte dem. Lad os prøve igen.
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(): omdanner en lvalue til en rvalue reference, muliggør move-semantik og overførsel af ejerskab uden kopiering.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat