Lvalue ou rvalue : la distinction
Raisonner sur les catégories de valeurs : lvalues, prvalues et xvalues
Lvalue ou rvalue : la distinction est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
Deux mondes : lvalue et rvalue
Toute expression en C++ est soit une lvalue (une chose qui possède un nom et une adresse), soit une rvalue (une valeur temporaire qui n’a pas de nom).
Lvalues
Une lvalue désigne un objet persistant : vous pouvez obtenir son adresse avec &.
int x = 42; // x is an lvalue
int* p = &x; // taking the address of an lvalue
int& r = x; // r is an lvalue referenceRvalues
Une rvalue est une valeur temporaire : des littéraux, des valeurs de retour de fonctions ou des expressions comme a + b. Il est impossible d’obtenir son adresse.
int a = 5, b = 3;
int c = a + b; // (a + b) is an rvalue
// int* p = &(a + b); // ERROR: cannot take address of an rvaluePourquoi cette distinction est importante
Une rvalue est sur le point d’être détruite. Nous pouvons récupérer ses ressources en toute sécurité plutôt que de les copier : c’est le fondement de la sémantique de déplacement.
Trois catégories depuis C++11
Le C++ moderne affine ce modèle :
- lvalue : possède un nom et une identité
- prvalue (rvalue pure) : valeur temporaire pure (un littéral, une valeur retournée)
- xvalue (valeur en fin de vie) : sur le point de disparaître (le résultat de
std::move)
Références lvalue et rvalue
Une référence lvalue utilise & ; une référence rvalue utilise &&.
int x = 10;
int& lr = x; // lvalue reference
int&& rr = 42; // rvalue reference, binds to literalRègles de liaison
Compatibilité des types :
- une référence lvalue (
T&) se lie aux lvalues - une référence lvalue constante (
const T&) se lie aux deux catégories - une référence rvalue (
T&&) se lie uniquement aux rvalues (et aux xvalues)
Vérifier avec decltype
Vous pouvez demander au compilateur à quelle catégorie appartient une expression en lui appliquant decltype.
int x = 10;
static_assert(std::is_lvalue_reference<decltype((x))>::value);
// the extra parentheses make decltype yield the lvalue refPourquoi C++11 a ajouté les références rvalue
Pour permettre la sémantique de déplacement : un constructeur qui accepte T&& peut prendre possession des données internes d’une valeur temporaire, évitant ainsi une copie profonde.
Erreur courante : une référence rvalue nommée est une lvalue
Une variable de type référence rvalue, une fois déclarée, possède un nom, ce qui en fait une lvalue. Pour la transmettre comme une rvalue, utilisez std::move.
void f(std::string&& s) {
// s here is an lvalue!
process(std::move(s)); // now it is an rvalue again
}Aperçu du transfert parfait
Les modèles qui acceptent T&& déduisent soit une référence lvalue, soit une référence rvalue. Associés à std::forward, ils peuvent préserver la catégorie de valeur, un point étudié plus en détail ultérieurement.
Vérification rapide
Laquelle de ces expressions est une rvalue ?
Récapitulatif
Une lvalue possède un nom et une adresse ; une rvalue est une valeur temporaire. T& se lie aux lvalues, tandis que T&& se lie aux rvalues. Cette distinction permet la sémantique de déplacement et évite les copies inutiles de valeurs temporaires.
Questions Fréquemment Posées
La leçon « Lvalue ou rvalue : la distinction » est-elle gratuite ?
Oui — le texte complet de « Lvalue ou rvalue : la distinction » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Lvalue ou rvalue : la distinction » ?
Raisonner sur les catégories de valeurs : lvalues, prvalues et xvalues Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Lvalue ou rvalue : la distinction » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Lvalue ou rvalue : la distinction
- Références rvalue et syntaxe &&
- std::move et std::forward
- Constructeurs de déplacement et affectation par déplacement