Références Rvalue et Lvalue
Glissez pour afficher le menu
Les concepts lvalue et rvalue sont liés à la classification des expressions.
-
lvalueou valeur à gauche : expression qui fait référence à un objet avec une adresse mémoire identifiable. Représente un objet pouvant être modifié ; -
rvalueou valeur à droite : expression représentant une valeur temporaire ou jetable.
Valeurs temporaires
Une valeur temporaire est un résultat intermédiaire de courte durée créé lors de l'évaluation d'une expression.
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);
Les valeurs temporaires sont automatiquement gérées par le compilateur et existent pendant la durée de l'expression ou de l'opération où elles sont créées. Ensuite, elles sont généralement supprimées, et le résultat est stocké dans la variable cible ou utilisé selon les besoins.
Sémantique de déplacement
Une référence à une valeur rvalue est indiquée par le double esperluette (&&).
La seule différence entre une référence lvalue et rvalue est qu'une rvalue peut être liée à un objet temporaire, alors qu'une référence lvalue ne le peut pas.
int&& ref_value = 5 * 5;
Utiliser une référence rvalue dans ce contexte n'est pas très pratique, car il n'y a aucun avantage à utiliser une référence rvalue pour un simple littéral.
Une combinaison de références lvalue et rvalue est utilisée pour prendre en charge les sémantiques de déplacement, permettant le transfert de ressources d’un objet à un autre sans copie inutile. Consultez l’exemple ci-dessous :
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` }
Mais nous n’avons pas besoin de copies de a ou b. Nous voulions simplement les échanger. Essayons à nouveau.
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(): transforme une lvalue en une référence rvalue, permettant la sémantique de déplacement et le transfert de propriété sans copie.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion