我正在学习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);
}
据我了解,该int
范围内给出的任何值(在我的情况下int
为4字节)都将被调用,display(int)
而该范围外的任何值都将是模棱两可的(因为编译器无法确定要调用哪个函数)。int
除最小值外,它对于整个值范围均有效,即-2147483648
编译失败并显示错误
重载的呼叫
display(long int)
是模棱两可的
但是对取相同的值int
并打印该值将给出2147483648
。我真的对这种行为感到困惑。
为什么仅当传递最大负数时才会观察到此行为?(如果将a short
与-32768
-一起使用,其行为是相同的-实际上,在任何情况下,负数和正数具有相同的二进制表示形式)
使用的编译器:g ++(GCC)4.8.5
call of overloaded ‘display(long int)’ is ambiguous
。
typeof(-2147483648) != int
。字面量是2147483648
,对于来说太大了int
,所以它是long
,并且被否定了
int j{-2147483648};
转换范围越来越窄。几乎值得一个问题。这可能与允许(例如)long long
constexpr值(例如2147483647LL
在初始化时变窄)有关。