Comprendre le concept de références universelles et de transfert
En C, la distinction entre les références universelles et de transfert peut prêter à confusion. Bien que les deux termes fassent référence au même concept, leurs définitions précises ont évolué au fil du temps.
En C 11, le terme « référence universelle » a été introduit pour décrire la capacité d'un paramètre de modèle à accepter à la fois les références rvalue et lvalue. . Ceci a été réalisé en utilisant une référence rvalue à un paramètre de modèle cv non qualifié.
Cependant, avec l'introduction de C 14, un terme plus précis a été adopté : "référence de transfert". Comme défini dans la norme C 14, une référence de transfert est « une référence rvalue à un paramètre de modèle non qualifié de cv ».
Différence clé
La principale différence entre et la transmission des références réside dans leur sémantique. Bien que les deux acceptent à la fois les références rvalue et lvalue, la norme précise que pour les références de transfert, le type déduit pour un argument donné est "référence lvalue à A" si l'argument est une lvalue.
Forwarding
Il est important de noter que le terme « référence de transfert » n'implique pas l'utilisation de la fonction std::forward dans la fonction corps. L'aspect transmission se réfère uniquement au processus de déduction de type. Que la référence soit transmise ou non par la suite n'a pas d'importance.
Exemple
Considérez le modèle de fonction suivant :
template<typename A> void foo(A&& a) { // Forwarding does not occur here }
Dans cet exemple, le le type du paramètre a est une référence de transfert. Si une lvalue est passée en argument à cette fonction, le type de a sera déduit comme « référence lvalue à A ». Cependant, le corps de fonction n'effectue aucune redirection.
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!