Maison  >  Article  >  développement back-end  >  Pourquoi le passage de l'entier le plus négatif à une fonction surchargée provoque-t-il une ambiguïté en C ?

Pourquoi le passage de l'entier le plus négatif à une fonction surchargée provoque-t-il une ambiguïté en C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-04 12:51:29625parcourir

Why Does Passing the Most Negative Integer to an Overloaded Function Cause Ambiguity in C  ?

Ambiguïté dans la résolution de surcharge pour l'entier le plus négatif

En C, la surcharge de fonctions permet à plusieurs fonctions d'avoir le même nom mais des types de paramètres différents. Cependant, lors de la résolution d'appels de fonction surchargés, une ambiguïté peut survenir si le compilateur ne peut pas déterminer la fonction la plus appropriée à appeler.

Considérez le code suivant illustrant la surcharge de fonction pour l'affichage de valeurs entières et non signées :

<code class="cpp">void display(int a) { cout << "int" << endl; }
void display(unsigned a) { cout << "unsigned" << endl; }

D'après notre compréhension, toute valeur entière comprise dans la plage spécifiée pour int devrait invoquer display(int), tandis que les valeurs en dehors de cette plage provoqueraient une ambiguïté. Cependant, lorsqu'il tente de transmettre la valeur int la plus négative (-2147483648) à afficher, le compilateur génère une erreur :

call of overloaded display(long int) is ambiguous

Ce comportement surprenant provient de l'absence de littéraux entiers négatifs en C . Les littéraux entiers définis dans la norme C n'incluent pas le caractère '-'. Au lieu de cela, lorsqu'il rencontre un '-' suivi d'un nombre, le compilateur le traite comme l'opérateur de négation unaire appliqué à un littéral entier positif.

Dans notre cas, '-2147483648' est interprété comme '-1 * 2147483648'. Puisque « 2147483648 » dépasse la plage d’un int, il est promu en long int. Cette promotion de type conduit à une ambiguïté car désormais display(int) et display(long int) sont des candidats viables pour l'appel de fonction.

Pour éviter de telles ambiguïtés, il est recommandé d'utiliser la classe std::numeric_limits pour récupérer les valeurs minimales ou maximales pour différents types de données de manière portable :

<code class="cpp">std::cout << std::numeric_limits<int>::min() << endl;</code>

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