Maison > développement back-end > C++ > Pourquoi une variable de référence Rvalue ne correspond-elle pas à une signature de fonction de référence Rvalue ?

Pourquoi une variable de référence Rvalue ne correspond-elle pas à une signature de fonction de référence Rvalue ?

Mary-Kate Olsen
Libérer: 2024-12-10 22:46:11
original
800 Les gens l'ont consulté

Why Doesn't an Rvalue Reference Variable Match an Rvalue Reference Function Signature?

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
Copier après la connexion

Dans fonction g :

void g(T&& t) { 
  f(t);  // Calls Overload #2
}
Copier après la connexion

É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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal