Rvalue- en Lvalue-referenties
Veeg om het menu te tonen
De concepten lvalue en rvalue zijn gerelateerd aan de classificatie van expressies.
-
lvalueof linkerwaarde: een expressie die verwijst naar een object met een identificeerbare geheugenlocatie. Het vertegenwoordigt een object dat gewijzigd kan worden; -
rvalueof rechterwaarde: een expressie die een tijdelijke of wegwerpwaarde vertegenwoordigt.
Tijdelijke waarden
Een tijdelijke waarde is een kortlevend, tussentijds resultaat dat wordt gecreëerd tijdens de evaluatie van een expressie.
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);
Tijdelijke waarden worden automatisch beheerd door de compiler en bestaan gedurende de expressie of bewerking waarin ze zijn aangemaakt. Daarna worden ze meestal verwijderd en wordt het resultaat opgeslagen in de doelvariabele of gebruikt zoals nodig.
Move-semantiek
Een rvalue-referentie wordt aangeduid met een dubbele ampersand (&&).
Het enige verschil tussen een lvalue- en rvalue-referentie is dat een rvalue gebonden kan worden aan een tijdelijk object, terwijl een lvalue-referentie dat niet kan.
int&& ref_value = 5 * 5;
Het gebruik van een rvalue-referentie in deze context is mogelijk niet erg praktisch, omdat er geen voordeel is aan het gebruik van een rvalue-referentie voor een eenvoudige literal.
Een combinatie van lvalue- en rvalue-referenties wordt gebruikt om move-semantiek te ondersteunen, waardoor resources kunnen worden overgedragen van het ene object naar het andere zonder onnodig kopiëren. Bekijk het onderstaande voorbeeld:
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` }
Maar we hebben geen kopieën van a of b nodig. We wilden ze gewoon omwisselen. Laten we het opnieuw proberen.
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(): transformeert een lvalue in een rvalue-referentie, maakt move-semantiek mogelijk en de overdracht van eigendom zonder kopiëren.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.