为什么编译器匹配“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)转换 :积分转换,浮点转换,浮点积分转换,指针转换,指针到成员转换,布尔转换,派生类到用户定义的转换

所以,从charint的提升优于从charshort转换。


什么是促销? 你可能会问。 这是标准描述的一种特殊的转换。

为什么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可以转换为intunsigned int具体取决于基础types: signed charunsigned char (见上);
  • […]

所以,如果有一个函数f(int)f(short) ,编译器将首先尝试进行整数提升 ,如果不可能,它将回退到整数转换

charint整数提升 (见上),所以编译器会select它。

如果没有任何f(int) ,编译器将无法find一个可以进行整数提升的函数,并且会回退到整数转换。 它find一个f(short) ,一个char可以转换成short ,所以它会select它。