Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Références Rvalue et Lvalue | Section
Pointeurs et Références en C++

bookRéférences Rvalue et Lvalue

Glissez pour afficher le menu

Les concepts lvalue et rvalue sont liés à la classification des expressions.

  • lvalue ou valeur à gauche : expression qui fait référence à un objet avec une adresse mémoire identifiable. Représente un objet pouvant être modifié ;

  • rvalue ou 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

rvalue.h

copy
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;
Note
Remarque

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

swap.h

copy
123456
std::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

main.cpp

copy
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.

question mark

Qu'est-ce qu'une lvalue ?

Sélectionnez la réponse correcte

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 1. Chapitre 10

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Section 1. Chapitre 10
some-alt