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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-31 21:24:02863parcourir

Why does passing the most negative integer value to an overloaded function in C   lead to an ambiguity error, even though printing the value directly works correctly?

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!

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