Ambiguous Function Overloads with Negative Integer Literals
In C , function overloading allows multiple functions with the same name but different signatures. However, certain scenarios can lead to ambiguous function overloads, resulting in compilation errors. This behavior is particularly intriguing when dealing with the most negative integer value.
Consider the following code:
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); }
As expected, the call to cout successfully prints the value of i as -2147483648. However, the call to display(-2147483648) encounters an error:
call of overloaded display(long int) is ambiguous
Intriguingly, this behavior is unique to the most negative integer value, and the ambiguity arises due to an interesting characteristic of integer literals in C . In C , negative integer literals do not exist as independent entities. Instead, they are expressed as a unary minus operator (-) applied to a positive integer literal. This means -2147483648 is interpreted as -1 * 2147483648.
Since 2147483648 exceeds the range of int, it is promoted to a long int during evaluation. Consequently, when the compiler attempts to resolve the function call, it encounters two potentially viable overloads:
This ambiguity results in the compilation error.
To resolve this issue and ensure the intended behavior, it is recommended to use the std::numeric_limits utility for obtaining the minimum or maximum value for a specific type in a portable and unambiguous manner:
std::numeric_limits<int>::min(); // or max()
The above is the detailed content of Why Does Function Overloading Become Ambiguous When Using the Most Negative Integer Value in C ?. For more information, please follow other related articles on the PHP Chinese website!