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 ?

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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-28 11:16:13768parcourir

When Do C   Overload Resolution Ambiguities Arise Between Value, Rvalue Reference, and Const Lvalue Reference Parameters?

Ambiguïté de résolution de surcharge : valeur, référence Rvalue et référence Const Lvalue

É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.

La règle

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.

Matrice de comparaison

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é.

Orientation future

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!

Déclaration:
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