Rvalue- og Lvalue-referanser
Sveip for å vise menyen
Begrepene lvalue og rvalue er knyttet til klassifisering av uttrykk.
-
lvalueeller venstreverdi: et uttrykk som refererer til et objekt med identifiserbar minneplassering. Representerer et objekt som kan endres; -
rvalueeller 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
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;
Å 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(): forvandler 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