最负整数的重载解析中的歧义
在 C 中,函数重载允许多个函数具有相同的名称但不同的参数类型。但是,在解析重载函数调用时,如果编译器无法确定要调用的最合适的函数,则可能会出现歧义。
请考虑以下代码,演示用于显示整数和无符号整数值的函数重载:
<code class="cpp">void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; }
根据我们的理解,任何在int指定范围内的整数值都应该调用display(int),而超出这个范围的值会导致歧义。但是,当尝试传递最负的 int 值 (-2147483648) 进行显示时,编译器会引发错误:
call of overloaded display(long int) is ambiguous
这种令人惊讶的行为源于 C 中缺少负整数文字。 C 标准中定义的整数文字不包含“-”字符。相反,当遇到“-”后跟数字时,编译器会将其视为应用于正整数文字的一元否定运算符。
在我们的例子中,“-2147483648”被解释为“-1 *” 2147483648'。由于'2147483648'超出了int的范围,因此它被提升为long int。这种类型提升会导致歧义,因为现在 display(int) 和 display(long int) 都是函数调用的可行候选者。
为了避免此类歧义,建议使用 std::numeric_limits 类来以可移植的方式检索不同数据类型的最小值或最大值:
<code class="cpp">std::cout << std::numeric_limits<int>::min() << endl;</code>
以上是为什么将最大负整数传递给重载函数会导致 C 中的歧义?的详细内容。更多信息请关注PHP中文网其他相关文章!