Maison > développement back-end > C++ > Quand un paramètre de référence Rvalue peut-il se lier à un argument Lvalue en C ?

Quand un paramètre de référence Rvalue peut-il se lier à un argument Lvalue en C ?

Linda Hamilton
Libérer: 2024-12-07 21:48:18
original
903 Les gens l'ont consulté

When Can an Rvalue Reference Parameter Bind to an Lvalue Argument in C  ?

Pourquoi un paramètre de référence Rvalue peut se lier à un argument Lvalue

En C, les références rvalue sont censées être liées à des rvalues. Cependant, il existe des cas où un paramètre de référence rvalue peut correspondre à un argument lvalue, ce qui surprend de nombreux programmeurs.

Considérez le code suivant :

void f(T&&); // #1
void f(T&);  // #2
Copier après la connexion

Normalement, nous nous attendrions à ce que f(T&&) surcharge à appeler lors du passage d'une rvalue, et surcharge f(T&) pour les lvalues. Cependant, le comportement est différent :

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

Dans cet exemple, la surcharge f(T&) est appelée même si t est une rvalue. Cela se produit parce que, malgré son type de référence rvalue, t est toujours considéré comme une lvalue.

La justification :

Les Rvalues ​​sont généralement des entités sans nom ou celles qui perdront leur noms sous peu. Les références Rvalue ne peuvent se lier qu’à des rvalues. Cependant, t a un nom et sa durée de vie n'expirera pas immédiatement.

Le type T&& :

T&& est le type d'une référence rvalue. Bien qu'il ne puisse se lier qu'à des rvalues, il se comporte autrement comme une lvalue de type rvalue référence. Sa nature de référence rvalue n'a d'importance que lors de sa construction et lors de l'exécution de decltype(variable_name).

Le rôle de std::move():

std::move( ) renvoie une référence rvalue en effectuant un static_cast(t).

Le pertinent Règles :

  • Un déplacement implicite vers un paramètre de référence rvalue se produit lors du renvoi d'une valeur nommée à partir d'une fonction, ou lorsque la valeur n'a pas de nom.
  • Uniquement rvalue Les références et const& peuvent se lier à des rvalues.
  • Les références Rvalue et const& subissent une extension de durée de vie lorsqu'elles sont directement liées à une référence en dehors d'un constructeur.
  • L'effondrement des références transforme T&& en X& ou X const& si T est de type X& ou X const&.
  • Dans les contextes de déduction de type, T&& déduit T comme X, X&, X const& ou X const&& basé sur le type d'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