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 :
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!