Maison > développement back-end > C++ > Comment la résolution de surcharge C gère-t-elle les paramètres de référence Value, Rvalue et Const Lvalue ?

Comment la résolution de surcharge C gère-t-elle les paramètres de référence Value, Rvalue et Const Lvalue ?

DDD
Libérer: 2024-12-01 09:40:12
original
329 Les gens l'ont consulté

How Does C   Overload Resolution Handle Value, Rvalue Reference, and Const Lvalue Reference Parameters?

Résolution de surcharge : valeur, référence Rvalue et référence Const Lvalue

En résolution de surcharge, il n'est pas rare de rencontrer des appels ambigus lorsque plusieurs les fonctions viables partagent le même type de paramètre. Un cas particulièrement intrigant se produit lorsqu'une surcharge se produit entre une valeur, une référence rvalue et une référence const lvalue.

Ambiguïté et résolution

Étant donné les fonctions :

int f( int );
int f( int && );
int f( int const & );
Copier après la connexion

l'appel int q = f( 3 ); devient ambigu. Clang et GCC préfèrent la référence rvalue à la référence lvalue lorsque f( int ) est supprimé. Cependant, la suppression de l'une ou l'autre surcharge de référence entraîne une ambiguïté avec f( int).

Règles de résolution de surcharge

La résolution de surcharge est basée sur la recherche d'une « meilleure correspondance » unique pour le paramètre. En l'absence de règles spéciales, les trois initialisations (valeur, référence rvalue et référence const lvalue) seraient indiscernables.

Cependant, puisqu'une référence rvalue se lie à une rvalue et qu'une référence const lvalue ne le fait pas, le La référence rvalue est considérée comme une meilleure correspondance en raison de la règle suivante dans 13.3.3.2 :

S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.
Copier après la connexion

Cette règle ne s'applique pas lorsqu'on l'initialisation n'est pas une liaison de référence.

Proposition de futures normes

L'auteur propose qu'un int && soit préféré à int dans les futures normes car il force une liaison d'initialisation à un initialiseur, contrairement au type d'objet sans contrainte. Cela pourrait servir d'alternative au pur transfert par valeur tout en évitant les frais généraux liés au déménagement.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal