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!