为什么编译器匹配“char”到“int”而不是“short”?
我有一个小程序:
#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
优先?
我也知道整数提升发生在一个expression式(如A = B)。 但是我没有expressionf(),
调用f(),
对吧?
如果这与重载parsing规则有关,为什么传递char
到f会导致编译器宁愿int
short
?
如果我删除f(int)
,那么f(c)
将调用f(short)
!
所以总的来说,我的问题是,它与“整数提升”还是“超载parsing规则”有关? 为什么?
(积分)推广优于(整数)通过重载分辨率转换
隐式转换序列的sorting
1)完全匹配:不需要转换,左值到右值转换,限定转换,函数指针转换(自C ++ 17以来)用户定义的类types转换为相同的类
2)推广 :整体推广,浮点推广
3)转换 :积分转换,浮点转换,浮点积分转换,指针转换,指针到成员转换,布尔转换,派生类到用户定义的转换
所以,从char
到int
的提升优于从char
到short
转换。
什么是促销? 你可能会问。 这是标准描述的一种特殊的转换。
为什么char
不是一个促销? ,你可以继续。 整体推广总是以int
或更大的types。 有没有促销short
。
以下隐式转换被归类为整体促销:
signed char或signed short可以转换为int;
如果unsigned char或unsigned short可以保存其整个值范围,则可以将其转换为int,否则返回unsigned int;
char可以转换为int或unsigned int,具体取决于基础types:signed char或unsigned char(见上);
可以将wchar_t,char16_t和char32_t转换为下面列表中的第一个types,它们可以保存其整个值范围:int,unsigned int,long,unsigned long,long long,unsigned long long; 基础types不固定的非范型枚举types可以转换为以下列表中的第一个types,它们可以保存其整个值范围:int,unsigned int,long,unsigned long,long long或unsigned long long。 如果价值范围较大,则不适用整体促销;
基础types固定的非范型枚举types可以转换为其提升的基础types;
(自C ++ 11以来)
如果位域可以表示位域的整个值范围,则可以将位域types转换为int;否则,如果可以表示位域的整个值域,则转换为无符号整数,否则不应用整数升级; types布尔可以被转换为int值,其值为0,真值为1。
标准参考(现行标准草案):
[over.ics.scs]§3
[conv.prom]§1
来自隐式转换 (cppreference):
以下隐式转换被归类为整体促销:
- […]
char
可以转换为int
或unsigned int
具体取决于基础types:signed char
或unsigned char
(见上);- […]
所以,如果有一个函数f(int)
和f(short)
,编译器将首先尝试进行整数提升 ,如果不可能,它将回退到整数转换 。
char
到int
是整数提升 (见上),所以编译器会select它。
如果没有任何f(int)
,编译器将无法find一个可以进行整数提升的函数,并且会回退到整数转换。 它find一个f(short)
,一个char
可以转换成short
,所以它会select它。