Maison >développement back-end >C++ >Pourquoi « f(T&&) » n'est-il pas appelé lors de la transmission d'une référence Rvalue ?

Pourquoi « f(T&&) » n'est-il pas appelé lors de la transmission d'une référence Rvalue ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-08 13:17:11150parcourir

Why Doesn't `f(T&&)` Get Called When Passing an Rvalue Reference to It?

Pourquoi les variables de référence rvalue ne sont pas des références rvalue

Considérons deux surcharges d'une fonction f :

void f(T&&&); // #1
void f(T&);  // #2

Dans une autre fonction g :

void g(T&& t) 
{ 
  f(t);  // calls #2
}

Pourquoi la surcharge f(T&) est-elle appelée malgré le paramètre n'est-ce pas une rvalue ?

La nature des références rvalue

Les références Rvalue sont des variables qui ne peuvent se lier qu'à des rvalues ​​(objets sans noms). T&&t a un nom, ce qui en fait une lvalue.

Distinction entre type et valeur

T&& est la référence du type rvalue. Une référence rvalue ne peut être liée qu'à des rvalues, mais il s'agit par ailleurs d'une lvalue de type référence.

Cas particuliers

  • static_cast(t) : Cela crée explicitement une référence rvalue, permettant à l'appel de f(T&&).

Règles régissant les références Rvalue

  • Des mouvements implicites se produisent lors du renvoi de valeurs nommées à partir de fonctions ou lorsque les valeurs n'ont pas de nom.
  • Les références Rvalue ou const& ne peuvent se lier qu'à des rvalues.
  • L'extension de durée de vie de référence s'applique aux temporaires liés à des références extérieures aux constructeurs.
  • Dans certains contextes, T&& se réduit à X& ou X const& si T est X& ou X const&.
  • T&& peut agir comme une "référence de transfert" dans le type déduction.

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