Maison >développement back-end >C++ >Pourquoi la résolution de surcharge est-elle ambiguë entre `int`, `int&&` et `const int&` en C ?

Pourquoi la résolution de surcharge est-elle ambiguë entre `int`, `int&&` et `const int&` en C ?

DDD
DDDoriginal
2024-11-28 15:58:10733parcourir

Why is Overload Resolution Ambiguous Between `int`, `int&&`, and `const int&` in C  ?

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

En C, lorsqu'un appel de fonction implique plusieurs surcharges, la résolution de surcharge détermine la meilleure correspondance sur la base d'un ordre partiel strict. Cependant, certains scénarios introduisent une ambiguïté, comme en témoigne le code suivant :

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );

Bien que cet appel soit ambigu, la suppression de f( int ) amène Clang et GCC à favoriser la surcharge de référence rvalue f( int && ) sur la référence lvalue f( int const & ). 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

Dans la résolution de surcharge, une initialisation de paramètre dans un appel de fonction doit être une meilleure correspondance que les deux autres initialisations. Lorsque l'on compare deux initialisations, l'une peut être meilleure, impossible à distinguer ou pire. Dans le scénario donné, les règles spéciales pour la liaison de référence directe rendent int && meilleur que const int &, mais ni l'un ni l'autre n'est meilleur ou pire que int. Par conséquent, aucune meilleure correspondance n'existe.

Règle spéciale pour les références Rvalue

Curieusement, la règle qui favorise les références rvalue par rapport aux références lvalue ne s'applique que lorsque les deux initialisations impliquent des liaisons de référence. Cependant, lorsqu'une initialisation est une liaison sans référence, comme dans le cas de int, cette règle ne s'applique pas.

Extensions futures possibles

La proposition de prioriser int && over int dans la résolution de surcharge vise à fournir un mécanisme plus efficace pour gérer la propriété. En liant la référence à un initialiseur, cette approche garantit que l'objet appartient et peut être manipulé directement, éliminant potentiellement la surcharge de copie.

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