Riferimenti Rvalue e Lvalue
Scorri per mostrare il menu
I concetti di lvalue e rvalue sono legati alla classificazione delle espressioni.
-
lvalueo valore sinistro: espressione che fa riferimento a un oggetto con una posizione di memoria identificabile. Rappresenta un oggetto che può essere modificato; -
rvalueo valore destro: espressione che rappresenta un valore temporaneo o usa e getta.
Valori temporanei
Un valore temporaneo è un risultato intermedio di breve durata creato durante la valutazione di un'espressione.
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);
I valori temporanei sono gestiti automaticamente dal compilatore ed esistono per la durata dell'espressione o dell'operazione in cui vengono creati. Successivamente, vengono generalmente scartati e il risultato viene memorizzato nella variabile di destinazione o utilizzato secondo necessità.
Semantica di spostamento
Un riferimento rvalue è indicato dal doppio e commerciale (&&).
L'unica differenza tra un riferimento lvalue e rvalue è che il rvalue può essere associato a un oggetto temporaneo, mentre un riferimento lvalue non può.
int&& ref_value = 5 * 5;
L'utilizzo di un riferimento rvalue in questo contesto potrebbe non essere molto pratico, poiché non vi è alcun vantaggio nell'usare un riferimento rvalue per un semplice valore letterale.
Una combinazione di lvalue e rvalue reference viene utilizzata per supportare le move semantics, permettendo il trasferimento delle risorse da un oggetto a un altro senza copie non necessarie. Osserva l'esempio qui sotto:
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` }
Ma non abbiamo bisogno di copie di a o b. Volevamo semplicemente scambiarli. Proviamo di nuovo.
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(): trasforma un lvalue in un riferimento rvalue, abilitando le move semantics e il trasferimento della proprietà senza copia.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione