Maison >développement back-end >C++ >Pourquoi le passage de la valeur entière la plus négative à une fonction surchargée en C entraîne-t-il une erreur d'ambiguïté, même si l'impression directe de la valeur fonctionne correctement ?
Surcharge de fonctions ambiguë pour la valeur entière la plus négative
En C, la surcharge de fonctions autorise plusieurs fonctions avec le même nom mais des paramètres différents. Cependant, une ambiguïté surgit lorsque le compilateur ne peut pas déterminer quelle fonction surchargée appeler en fonction des arguments donnés. Ce problème peut survenir lorsque vous travaillez avec des types entiers, en particulier lorsqu'il s'agit de la valeur la plus négative.
Considérez l'extrait de code suivant :
<code class="c++">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; //will display -2147483648 display(-2147483648); }
Selon notre compréhension de la surcharge de fonctions, toute valeur dans la plage entière (4 octets dans ce cas), il faut appeler la fonction display(int). Des valeurs en dehors de cette plage entraîneraient une ambiguïté. Cependant, la compilation de ce code entraîne l'erreur suivante :
call of overloaded `display(long int)` is ambiguous
Cette erreur survient lors du passage de la valeur entière la plus négative (-2147483648) à la fonction d'affichage. Étrangement, imprimer directement la même valeur (comme on le voit à la ligne 6) produit le résultat correct : -2147483648.
La subtilité : manque de littéraux négatifs en C
Le la clé pour comprendre ce comportement réside dans l’absence de littéraux négatifs en C . Tous les littéraux entiers en C sont considérés comme non signés par défaut, ce qui signifie qu'ils n'ont pas de préfixe de signe (- ou ). En conséquence, -2147483648 est en fait traité comme -1 * (2147483648).
Implications pour les fonctions surchargées
Puisque 2147483648 dépasse la plage d'un entier (4 octets ), il est promu en entier long. Cela signifie que le compilateur tente d'appeler la fonction display(long int), ce qui entre en conflit avec la surcharge display(int) existante. Par conséquent, l'ambiguïté surgit.
Résolution
Pour éviter cette ambiguïté, il est recommandé d'utiliser la classe std::numeric_limits pour obtenir les valeurs minimales et maximales spécifiques au type. :
<code class="c++">std::cout << std::numeric_limits<int>::min() << endl; // displays -2147483648</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!