Maison  >  Article  >  développement back-end  >  Pourquoi la surcharge de fonctions devient-elle ambiguë lors de l'utilisation de la valeur entière la plus négative en C ?

Pourquoi la surcharge de fonctions devient-elle ambiguë lors de l'utilisation de la valeur entière la plus négative en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-30 06:36:03148parcourir

Why Does Function Overloading Become Ambiguous When Using the Most Negative Integer Value in C  ?

Surcharges de fonctions ambiguës avec des littéraux entiers négatifs

En C, la surcharge de fonctions autorise plusieurs fonctions avec le même nom mais des signatures différentes. Cependant, certains scénarios peuvent conduire à des surcharges de fonctions ambiguës, entraînant des erreurs de compilation. Ce comportement est particulièrement intrigant lorsqu'il s'agit de la valeur entière la plus négative.

Considérez le code suivant :

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);
}

Comme prévu, l'appel à cout imprime avec succès la valeur de i sous la forme -2147483648. . Cependant, l'appel à display(-2147483648) rencontre une erreur :

    call of overloaded display(long int) is ambiguous

Curieusement, ce comportement est unique à la valeur entière la plus négative, et l'ambiguïté survient en raison d'une caractéristique intéressante des littéraux entiers en C . En C , les littéraux entiers négatifs n'existent pas en tant qu'entités indépendantes. Au lieu de cela, ils sont exprimés sous la forme d’un opérateur moins unaire (-) appliqué à un littéral entier positif. Cela signifie que -2147483648 est interprété comme -1 * 2147483648.

Étant donné que 2147483648 dépasse la plage de int, il est promu en long int lors de l'évaluation. Par conséquent, lorsque le compilateur tente de résoudre l'appel de fonction, il rencontre deux surcharges potentiellement viables :

  • display(int) avec -1 comme argument
  • display(long int) avec 2147483648 comme argument

Cette ambiguïté entraîne une erreur de compilation.

Pour résoudre ce problème et garantir le comportement souhaité, il est recommandé d'utiliser l'utilitaire std::numeric_limits pour obtenir la valeur minimale ou maximale pour un type spécifique de manière portable et sans ambiguïté :

std::numeric_limits<int>::min();  // or max()

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