其他分享
首页 > 其他分享> > c – 为什么最负的int值会导致有关模糊函数重载的错误?

c – 为什么最负的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);
}

根据我的理解,int范围中给出的任何值(在我的情况下int为4字节)将调用display(int),并且此范围之外的任何值都将是不明确的(因为编译器无法决定调用哪个函数).除了最小值之外,它对整个int值范围有效,即-2147483648,其中编译因错误而失败

call of overloaded display(long int) is ambiguous

但是将相同的值带到int并打印该值会产生2147483648.我对这种行为感到困惑.

为什么只有在传递最负数时才会观察到这种行为? (如果short与-32768一起使用,则行为相同 – 事实上,在任何情况下,负数和正数具有相同的二进制表示)

编译使用:g(GCC)4.8.5

解决方法:

这是一个非常微妙的错误.你所看到的是C中没有负整数文字的结果.如果我们看[lex.icon],我们得到一个整数字面,

integer-literal
        decimal-literal integer-suffixopt
        […]

可以是小数字,

decimal-literal:
        nonzero-digit
        decimal-literal ’ opt digit

其中digit为[0-9]且非零数字为[1-9],后缀par可以为u,U,l,L,ll或LL之一.它在这里没有包括 – 作为十进制文字的一部分.

在§2.13.2中,我们还有:

An integer literal is a sequence of digits that has no period or exponent part, with optional separating single quotes that are ignored when determining its value. An integer literal may have a prefix that specifies its base and a suffix that specifies its type. The lexically first digit of the sequence of digits is the most significant. A decimal integer literal (base ten) begins with a digit other than 0 and consists of a sequence of decimal digits.

(强调我的)

这意味着 – 在-2147483648是一元运算符 – .这意味着-2147483648实际上被视为-1 *(2147483648).由于2147483648对于你的int来说太多了,所以它被提升为一个long int,并且模糊性来自于不匹配.

如果要以便携方式获取类型的最小值或最大值,可以使用:

std::numeric_limits<type>::min();  // or max()

标签:c,overloading,integer,negative-number,ambiguous-call
来源: https://codeday.me/bug/20190926/1821525.html