我有一个小程序:
#include<iostream>
using namespace std;
void f(int) { cout << "int\n"; }
void f(short) { cout << "short\n"; }
int main(void){
char c = 0;
f(c);
return 0;
}
它打印int
。我觉得,如果这是因为“整数提升”,为什么不是short
首选?
我也知道整数提升发生在表达式中(例如A = B)。但是我没有表达对f(),
权利的呼吁吗?
如果这是关系到重载解决规则,为什么传递char
到F将导致到编译器宁愿int
到short
?
如果我删除f(int)
,那么f(c)
会打电话给f(short)
!
因此,总而言之,我的问题是,它与“整数提升”还是“过载解决规则”有关?又为什么呢
通过重载解析,(积分)促销优先于其他(积分)转化
隐式转换序列的排名
1)完全匹配:无需转换,左值到右值转换,限定转换,函数指针转换,(从C ++ 17开始)用户定义的类类型到相同类的转换
2)促销:积分促销,浮点促销
3)转换:积分转换,浮点转换,浮点积分转换,指针转换,指针到成员转换,布尔值转换,用户定义的派生类到其基类的转换
因此,从char
到的升迁int
优先于从char
到的转化short
。
什么是促销?你可能会问。这是标准描述的一种特殊转换。
为什么char
到short
不升职?,您可以继续。整体促销始终是int
或更大的类型。没有任何促销short
。
以下隐式转换被归类为整体促销:
带符号的char或带符号的short可以转换为int;
如果unsigned char或unsigned short可以保持整个值范围,则可以将其转换为int,否则可以将其转换为insigned;
可以根据底层类型将char 转换为int或unsigned int:signed char或unsigned char(请参见上文);
wchar_t,char16_t和char32_t可以从下面的列表转换为第一种类型,该列表可以保留其整个值范围:int,unsigned int,long,unsigned long,long long,unsigned long long;可以将其基础类型未固定的无作用域枚举类型从下面的列表转换为第一种类型,该列表可以保留其整个值范围:int,unsigned int,long,unsigned long,long long或unsigned long long。如果值范围更大,则不应用整体促销;
固定基础类型的无范围枚举类型可以转换为其提升的基础类型;
(自C ++ 11起)
如果位字段类型可以表示位字段的整个值范围,则可以将其转换为int;如果可以表示位字段的整个值范围,则可以将其转换为unsigned int,否则不应用整数提升;bool类型可以转换为int,其值false变为``0'',true变为1。
标准参考(当前标准草案):
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句