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 & );
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.
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!