Maison > développement back-end > C++ > Comment les règles de réduction des références C 11 permettent-elles un transfert parfait ?

Comment les règles de réduction des références C 11 permettent-elles un transfert parfait ?

Linda Hamilton
Libérer: 2024-12-26 22:27:13
original
452 Les gens l'ont consulté

How Do C  11 Reference Collapsing Rules Enable Perfect Forwarding?

Rôle des règles de regroupement de références en C 11

Les règles de regroupement de références jouent un rôle crucial pour permettre un transfert parfait en C 11. Le transfert parfait permet fonctions pour accepter et transmettre de manière transparente les paramètres par valeur, référence lvalue ou rvalue référence.

Règles de regroupement de référence

Les règles de regroupement de référence pour C 11 sont :

  • A& & & -> A&
  • A& & & -> A&
  • A& & & -> A&
  • A& & & & & -> A& &

Justification de l'effondrement des références

Ces règles garantissent que, quelle que soit la manière dont un paramètre est transmis (par lvalue, rvalue ou rvalue référence), il sera toujours "vu" par la fonction réceptrice comme le type souhaité pour un rendu parfait. transfert.

  • Vers la référence Lvalue : Lors du passage d'une lvalue par référence lvalue (par exemple, T&), la règle de réduction convertit "& & &" en "&", en fournissant le référence lvalue correcte pour la liaison à la référence lvalue non const du récepteur.
  • Vers Const Lvalue Référence : Lors du passage d'une référence const lvalue par référence const lvalue (par exemple, const T&), la règle de réduction garantit que la constance est préservée et que le paramètre est lié à la référence const lvalue correcte dans le récepteur.
  • À la référence Rvalue : Passer une référence rvalue (par exemple, T& &), quel que soit le type de valeur entrant, entraîne un effondrement vers "& &", qui permet une transmission parfaite des valeurs x (objets temporaires) et prvalues ​​(valeurs de retour de fonction de type T& &).

Utilisation dans les fonctions utilitaires C 11 STL

Les fonctions utilitaires STL telles que std::move() et std::forward() utilisent la réduction des références en interne pour faciliter un transfert parfait. Par exemple :

template<class T>
void Fwd(T & &v) {
  Call(std::forward<T>(v));
}
Copier après la connexion

std::forward<> réduit "& &" en "&" pour les références lvalue et "& &" en "& &" pour les références rvalue, permettant à Call de recevoir son paramètre dans le format approprié.

Relation avec std : :remove_reference

Des utilitaires comme std::remove_reference peuvent être utilisés pour supprimer des références d'une déduction de type (par exemple, std::remove_reference renvoie T). Cependant, cela ne remplace pas le besoin de règles de réduction des références dans C 11. std::remove_reference supprime simplement les couches de référence, tandis que la réduction des références garantit que le paramètre transmis est reçu dans le format correct pour un transfert parfait.

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