Maison >développement back-end >C++ >Pourquoi « T&& » ne se comporte-t-il pas toujours comme une véritable référence Rvalue ?

Pourquoi « T&& » ne se comporte-t-il pas toujours comme une véritable référence Rvalue ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-30 06:21:15502parcourir

Why Doesn't `T&&` Always Behave Like a True Rvalue Reference?

Pourquoi T&& ne se comporte-t-il pas comme une référence Rvalue ?

Lorsque vous travaillez avec des surcharges de fonctions comme void f(T&&) et void f(T& ), il est surprenant de constater que f(T&) est appelé lors du passage de T&&, même si l'inverse n'est pas vrai. Cela est dû au comportement des références rvalue en C .

Contrairement à l'intuition, T&& n'est pas simplement une référence rvalue. Il s'agit d'une référence de type rvalue, ce qui signifie qu'elle ne peut se lier qu'à des rvalues ​​mais se comporte autrement comme une lvalue de type rvalue référence. Ce comportement de liaison garantit que les objets sans nom et ceux sur le point de perdre leur nom sont automatiquement traités comme des rvalues.

Cependant, puisque T&& a un nom (c'est-à-dire t), il est considéré comme une lvalue et appelle donc le f( T&) surcharge. La conversion statique de t en T&&& à l'aide de f(static_cast(t)) est nécessaire pour invoquer la surcharge de référence rvalue f(T&&).

Pour résumer, les règles C régissant ce comportement sont :

  • Des mouvements implicites se produisent lors du renvoi de valeurs nommées à partir de fonctions, lorsque les valeurs n'ont pas de nom ou lorsque les fonctions renvoient explicitement une rvalue références.
  • Seules les références rvalue et const& peuvent se lier à des rvalues.
  • L'extension de la durée de vie des références sur les valeurs temporaires se produit lorsqu'elles sont directement liées à une référence en dehors d'un constructeur et s'applique aux références rvalue et const&.
  • T&& n'est pas toujours une référence de valeur ; il peut se réduire à X&, X const& ou X const&& en fonction du type de T.
  • T&& peut agir comme une « référence de transfert » dans les contextes de déduction de type, déduisant T en fonction du 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!

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