Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么最负的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 - Fatal编程技术网

为什么最负的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 的二进制表示,如下: