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
Linda Hamiltonoriginal
2024-12-07 21:48:18885parcourir

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

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
}

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!

Déclaration:
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