- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
重载函数时:
void add(int a)
{
a=7;
cout<<"int";
}
void add(double a)
{
a=8.4;
cout<<"double";
}
void add(int *b)
{
*b=4;
cout<<"pointer";
}
int main()
{
char i='a'; //char
add(i);
return 0;
}
输出:int
尽管没有将数据类型 char 作为参数的函数,但它工作正常。
但是当编译成下面的代码时:
void add(char a)
{
a='a';
cout<<"int";
}
void add(double a)
{
a=8.4;
cout<<"double";
}
void add(int *b)
{
*b=4;
cout<<"pointer";
}
int main()
{
int i=4; //int
add(i);
return 0;
}
给出错误(编译器 gcc):
cpp|21|error: call of overloaded 'add(int&)' is ambiguous
这背后的逻辑是什么?以及如何跟踪此类代码的控制传递或输出?
最佳答案
这个例子归结为整数提升和整数转换之间的区别。简而言之,促销是:
A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned int. [...] These conversions are called integral promotions.
而整数转换更通用:
A prvalue of an integer type can be converted to a prvalue of another integer type. [...] The conversions allowed as integral promotions are excluded from the set of integral conversions.
就重载决议而言,整数提升是比整数转换更好的转换。
在第一个例子中,我们有:
add(int ); // (1)
add(double ); // (2)
add(int* ); // (3)
并使用 char
调用。只有前两个是可行的,都涉及转换。 (1)涉及一个Integer Promotion,其中有rank Promotion。 (2)涉及到一个 float 转换,有秩转换。 Promotion 的排名高于 Conversion,因此 (1) 无疑是首选。
现在,在第二个例子中,我们有:
add(char ); // (1)
add(double ); // (2)
add(int* ); // (3)
并且正在使用 int
调用。再一次,只有前两个是可行的,并且都涉及转换。 (1) 这次涉及整数转换(因为char
的秩低于int
)和 (2) 仍然涉及浮点整数转换,两者具有相同的等级:转换。由于我们有两个排名相同的转换,因此没有“最佳”转换,因此没有最佳可行候选者。因此,我们有一个模棱两可的决议。
关于c++ - 函数重载变得模棱两可,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504353/
我在 android 代码中使用 asmack XMPP。我可以正常登录 XMPP 服务器,但是当我尝试创建新用户时出现问题。我想要实现的是: 以管理员身份登录。 创建一个新用户。 从管理员注销。 以
这是我的标记页面,其中有一个按钮可以从数据库中搜索数据并显示在网格中 这是我背后的代码 if (!IsPostBack) { LblInfo.Text = "Page Load
当我多次将相同的 float 值插入到我的集合中时,本应花费恒定时间的 x in s 检查变得非常慢。为什么? 时序x in s的输出: 0.06 microseconds 0.09 mi
我有一个小型聊天客户端,可以将所有历史记录存储在 sqlite 数据库中。当用户单击我的应用程序中的 history 选项卡时,我的应用程序会获取所有相关历史记录并将其显示在 QWebView 中。我
我是一名优秀的程序员,十分优秀!