Je vois du code sur StackOverflow de temps en temps, demandant une ambiguïté de surcharge avec quelque chose impliquant une fonction comme:
void foo(int&& param);
Ma question est la suivante: pourquoi cela se produit-il même? Ou plutôt, quand auriez-vous “une référence à une référence”? En quoi est-ce différent d’une vieille référence? Je ne l’ai jamais vu en code réel, alors je suis curieux de savoir quel type de code aurait besoin de cela.
C’est une référence rvalue, décrit Bjarne ici .
Copie sans vergogne (“citation”):
La référence de la valeur
Une référence de valeur est un type composé très similaire à la référence traditionnelle de C ++. Pour mieux distinguer ces deux types, nous nous référons à une référence C ++ traditionnelle en tant que référence lvalue. Lorsque le terme référence est utilisé, il fait référence aux deux types de référence: référence lvalue et référence rvalue.
Une référence lvalue est formée en plaçant un type & after.
A a; A& a_ref1 = a; // an lvalue reference
Une référence de valeur est formée en plaçant un && après un certain type.
A a; A&& a_ref2 = a; // an rvalue reference
Une référence rvalue se comporte comme une référence lvalue, sauf qu’elle peut se lier à une valeur temporaire (une valeur), alors que vous ne pouvez pas lier une référence (non const) à une valeur.
A& a_ref3 = A(); // Error! A&& a_ref4 = A(); // Ok
Ce n’est pas une référence à une référence : une telle chose n’existe pas.
C’est une référence rvalue , une nouvelle fonctionnalité ajoutée au C ++ 11, qui sera bientôt normalisé.
C’est une référence de valeur. Notez que les jetons &&
utilisés pour les références booléennes AND et rvalue, ainsi que les jetons &
utilisés pour les références AND au niveau du bit et les références normales, sont des “mots” différents selon le langage.
Une référence rvalue est (généralement) liée à un object qui peut être laissé dans un état indéterminé après la fin de la référence, sans doute parce que l’object sera détruit.
En termes simples, lier une variable à une référence de valeur est généralement la dernière chose à faire.
Contrairement à une référence normale mais comme une référence const &
, une référence rvalue peut se lier à une rvalue (une expression dont l’adresse ne peut pas être directement prise). Comme pour une référence régulière mais contrairement à une référence const &
, une référence rvalue peut être utilisée pour modifier son object.