Maison > Article > développement back-end > Comment la résolution de surcharge C gère-t-elle `int`, `int&&` et `const int&` ?
Résolution de surcharge entre la valeur, la référence Rvalue, la référence Const Lvalue
Considérez les surcharges de fonctions suivantes :
int f( int ); int f( int && ); int f( int const & );
L'appel int q = f( 3 ); est ambigu car les trois surcharges sont viables pour l'argument. Les règles de résolution des surcharges stipulent qu'il doit y avoir une initialisation de paramètre meilleure que les deux autres.
Dans ce cas, les initialisations de paramètres sont :
Cependant, aucune de ces initialisations n'est meilleure que les deux autres. Par conséquent, l'appel est ambigu.
La suppression de f( int ) amène Clang et GCC à préférer la référence rvalue (int&&) à la référence lvalue (int const&). En effet, la référence rvalue peut être liée à la rvalue 3, alors que la référence lvalue ne le peut pas. La suppression de l'une ou l'autre surcharge de référence entraîne une ambiguïté avec f( int ).
Ce comportement est dû au fait que int est équivalent à la fois à int&& et à int const&. Cependant, int&& et int const& ne sont pas équivalents. La règle pour choisir entre eux est que int&& est meilleur que int const& lorsque les deux sont des liaisons de référence et que int&& se lie à une rvalue et int const& se lie à une lvalue.
Cette règle ne s'applique pas lorsque l'une des initialisations est pas une liaison de référence. Par conséquent, int ne peut pas être distingué à la fois de int&& et de int const&.
Il n'y a aucune chance que int&& soit préféré à int dans une future norme. La règle proposée ferait qu'une liaison de référence correspondrait mieux qu'une liaison sans référence, ce qui irait à l'encontre des règles existantes en matière de résolution de surcharge.
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!