Maison >développement back-end >C++ >Quand des ambiguïtés de résolution de surcharge C surviennent-elles entre les paramètres de référence Value, Rvalue et Const Lvalue Reference ?
Étant donné trois fonctions surchargées avec différents types de paramètres (valeur, référence rvalue, référence const lvalue), un appel de fonction peut devenir ambigu si les trois surcharges sont viables. Cet article traite des règles régissant la résolution des surcharges dans de tels scénarios et explore le comportement nuancé observé en C.
Avec un seul paramètre à prendre en compte, la règle stipule qu'un paramètre d'initialisation doit être un meilleur match que les deux les deux autres. Lors de la comparaison de deux initialisations, soit l'une est jugée meilleure, soit aucune n'est considérée comme meilleure (indiscernable).
En l'absence de règles spéciales pour la liaison de référence directe, les trois initialisations seraient impossibles à distinguer dans les trois comparaisons. Cependant, ces règles spéciales élèvent int&& (référence rvalue) au-dessus de const int& (référence lvalue), alors qu'aucune n'est considérée comme meilleure ou pire que int (valeur). Ainsi, il n'y a pas de meilleure correspondance.
Ce comportement est illustré dans la matrice suivante :
S1 S2 int int&& indistinguishable int const int& indistinguishable int&& const int& S1 better
La matrice montre que int&& est préféré à const int& basé sur la clause 13.3.3.2 de la norme C. Cette règle s'applique aux liaisons de référence qui ne font pas référence à des paramètres d'objet implicites de fonctions membres non statiques sans qualificatifs ref, et où S1 lie une référence rvalue à une rvalue tandis que S2 lie une référence lvalue.
Cependant, cette règle ne s'applique pas lorsque l'une des initialisations n'est pas une liaison de référence, d'où l'ambiguïté.
La l'auteur suggère de considérer int&& (référence rvalue) comme une meilleure correspondance que int (valeur), car la référence doit se lier à un initialiseur alors que le type d'objet n'est pas soumis à une telle contrainte. Cela pourrait potentiellement créer une nouvelle règle de résolution de surcharge qui donne la priorité à la liaison à partir d'un initialiseur. Cependant, cette proposition nécessite des discussions plus approfondies et une potentielle normalisation via la plateforme de propositions futures isocpp.
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!