Pourquoi une variable de référence Rvalue n'est pas une Rvalue ?
Considérons deux fonctions surchargées f :
void f(T&&); // Overload #1 void f(T&); // Overload #2
Dans fonction g :
void g(T&& t) { f(t); // Calls Overload #2 }
Étonnamment, la surcharge #2 est appelée puisque t est considéré une lvalue, bien que la première surcharge ait une signature de référence rvalue (T&&).
Comment une signature de référence rvalue peut-elle ne pas correspondre à un appel transmettant une rvalue ?
Compréhension Règles C pour les Rvalues
Les Rvalues sont généralement des variables sans nom qui perdront leur nom sous peu. T&& t a l'identifiant t, c'est donc une lvalue. Cela est logique car les rvalues doivent être de courte durée et impossibles à consulter plus tard.
Cependant, T&& est la référence de type rvalue. Il ne peut se lier qu'à des rvalues sans impliquer de conversion statique, mais il s'agit toujours d'une lvalue de type rvalue référence. Sa nature de référence rvalue n’a d’importance que lors de son initialisation et de son utilisation decltype. Sinon, il agit comme une lvalue de type référence.
Cast statique et extension de référence
std::move(t) renvoie une référence rvalue en effectuant une conversion statique sur t. Cela permet à la valeur temporaire d'avoir une extension de durée de vie de référence lorsqu'elle est liée à une référence en dehors d'un constructeur.
La norme C définit des règles explicites pour gérer ces scénarios. Les références Rvalue et les références const peuvent se lier à des rvalues. Des mouvements implicites se produisent lors du renvoi d'une valeur nommée à partir d'une fonction, lorsqu'une valeur n'a pas de nom ou lorsqu'une fonction renvoie explicitement une référence rvalue.
De plus, T&& peut ne pas toujours être une référence rvalue. Si T est X& ou X const&, l'effondrement de la référence convertit T&& à X& ou X const&. Enfin, T&& peut agir comme une « référence de transfert » dans la déduction de type, selon le type de l'argument.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!