Ambiguïté de surcharge de fonctions avec l'entier le plus négatif
En C, la surcharge de fonctions autorise plusieurs fonctions portant le même nom mais des listes de paramètres différentes. Cependant, la rencontre de la valeur entière la plus négative peut entraîner une erreur d'ambiguïté en raison de conversions de type implicites.
Comprendre le problème
L'extrait de code suivant illustre le problème :
<code class="cpp">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; // prints -2147483648 display(-2147483648); // error: ambiguous function call }
Lorsque l'entier le plus négatif (-2147483648) est transmis à display(-2147483648), le compilateur génère une erreur "surcharges de fonctions ambiguës". Cela se produit car le compilateur ne peut pas déterminer quelle fonction appeler : display(int) ou display(unsigned).
Le rôle des littéraux entiers
Le comportement observé dans le L'exemple donné provient de l'absence de littéraux entiers négatifs en C . Les littéraux entiers doivent commencer par un chiffre différent de zéro. Dans le cas de -2147483648, le signe négatif est interprété comme l'opérateur moins unaire, ce qui donne l'expression -1 * (2147483648).
Type Promotion
Depuis 2147483648 dépasse la plage de int, il est promu en long int. Cependant, cette promotion crée une ambiguïté entre les types de paramètres display(int) et display(unsigned), conduisant à l'erreur.
Solution portable
Pour obtenir le valeurs minimales ou maximales pour un type de manière portable, on peut utiliser :
<code class="cpp">std::numeric_limits<type>::min(); // or max()</code>
En utilisant cette méthode, les surcharges de fonctions ambiguës sont évitées, garantissant une gestion correcte du type quelle que soit la mise en œuvre.
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!