首页 > 后端开发 > C++ > 为什么将最大负整数传递给重载函数会导致 C 中的歧义?

为什么将最大负整数传递给重载函数会导致 C 中的歧义?

Linda Hamilton
发布: 2024-11-04 12:51:29
原创
691 人浏览过

Why Does Passing the Most Negative Integer to an Overloaded Function Cause Ambiguity in C  ?

最负整数的重载解析中的歧义

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板