为什么最负的int值会导致关于不明确函数重载的错误? 我正在学习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); } void显示(int a) { cout
表达式为什么最负的int值会导致关于不明确函数重载的错误? 我正在学习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); } void显示(int a) { cout,c++,integer,overloading,negative-number,ambiguous-call,C++,Integer,Overloading,Negative Number,Ambiguous Call,表达式-2147483648实际上是将-运算符应用于常数2147483648。在您的平台上,int无法存储2147483648,它必须用更大的类型表示。因此,表达式-2147483648不能推断为带符号的intt较大的有符号类型,有符号长int 由于您没有为long提供重载,编译器被迫在两个同样有效的重载之间进行选择。编译器应该发出一个关于不明确重载的编译器错误。表达式-2147483648实际上是将-运算符应用于常量2147483648 。在您的平台上,int无法存储2147483648,它必
-2147483648
实际上是将-
运算符应用于常数2147483648
。在您的平台上,int
无法存储2147483648
,它必须用更大的类型表示。因此,表达式-2147483648
不能推断为带符号的int
t较大的有符号类型,有符号长int
由于您没有为
long
提供重载,编译器被迫在两个同样有效的重载之间进行选择。编译器应该发出一个关于不明确重载的编译器错误。表达式-2147483648
实际上是将-
运算符应用于常量2147483648
。在您的平台上,int
无法存储2147483648
,它必须由较大的类型表示。因此,表达式-2147483648
不会被推断为有符号int
,而是一个较大的有符号类型,有符号长int
由于您不为<代码>超长< /C++ >提供过载,编译器被迫在两个重载相等的情况下进行选择。编译器应该发出关于模糊重载的编译器错误。
这是一个非常微妙的错误。看看[lex.icon]我们得到了一个整数文本 整数文字十进制文字整数后缀点
[……] 可以是十进制文字 十进制文字:
非零位
“十进制文字”可选数字
数字是<代码> [09] < /代码>非零数字是代码> [1-9] < /代码>,后缀PAR可以是<代码> u>代码>,<代码> u>代码>,<代码> L<代码>,<代码> L>代码>,<代码> LL>代码>,或<代码> LL>代码>。这里没有包含“代码> -/代码>作为十进制文字的一部分。
在§2.13.2中,我们还有: 整型文字是一个没有句点或指数部分的数字序列,可选的分隔单引号在确定其值时被忽略。整型文字可能有一个指定其基的前缀和一个指定其类型的后缀。数字序列的词汇第一位数字是最重要的。 十进制整数文字(以10为基数)以0以外的数字开始,由一系列十进制数字组成。 (强调矿山) 这意味着-2147483648
中的-
是一元运算符-
。这意味着-2147483648
实际上被视为-1*(2147483648)
。由于2147483648
对于您的int
来说太多了,因此它被提升为长int
,而歧义来自于不匹配
如果要以可移植的方式获取类型的最小值或最大值,可以使用:
std::numeric_limits<type>::min(); // or max()
std::numeric_limits::min();//或max()
<代码> < p>这是一个非常微妙的错误。你看到的是C++中没有负整数字的结果。如果我们看[LX.ICON],我们得到一个整数文字,
整数文字
十进制文字整数后缀点
[……]
可以是十进制文字
十进制文字:
非零位
“十进制文字”可选数字
数字是<代码> [09] < /代码>非零数字是代码> [1-9] < /代码>,后缀PAR可以是<代码> u>代码>,<代码> u>代码>,<代码> L<代码>,<代码> L>代码>,<代码> LL>代码>,或<代码> LL>代码>。这里没有包含“代码> -/代码>作为十进制文字的一部分。
在§2.13.2中,我们还有:
整型文字是一个没有句点或指数部分的数字序列,可选的分隔单引号在确定其值时被忽略。整型文字可能有一个指定其基的前缀和一个指定其类型的后缀。数字序列的词汇第一位数字是最重要的。 十进制整数文字(以10为基数)以0以外的数字开始,由一系列十进制数字组成。
(强调矿山)
这意味着-2147483648
中的-
是一元运算符-
。这意味着-2147483648
实际上被视为-1*(2147483648)
。由于2147483648
对于您的int
来说太多了,因此它被提升为长int
,而歧义来自于不匹配
如果要以可移植的方式获取类型的最小值或最大值,可以使用:
std::numeric_limits<type>::min(); // or max()
std::numeric_limits::min();//或max()
扩展他人的答案
<强>以阐明为什么OP混淆,首先< /强>:考虑<代码>签名INT/COD> <代码> 2147483647 的二进制表示,如下:
下一步,将一个添加到此数字中:给出另一个签名整数
,-2147483648
(OP希望使用)
最后:当-2147483648
编译为长int
而不是有符号int
时,我们可以看出为什么OP会混淆,因为它显然适合32位
但是,正如当前的答案所提到的,一元运算符(-
)是在解析2147483648
后应用的,它是一个长整型
,不适合32位。扩展其他人的答案
<强>以阐明为什么OP混淆,首先< /强>:考虑<代码>签名INT/COD> <代码> 2147483647 的二进制表示,如下: