繁体   English   中英

为什么编译器将“char”匹配到“int”而不是“short”?

[英]Why does the compiler match “char” to “int” but not “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首选?

我也知道整数提升发生在表达式中(如 A=B)。 但是我在调​​用f(),没有表达f(),对吧?

如果这与重载解析规则有关,为什么将char传递给 f 会导致编译器更喜欢int而不是short

如果我删除f(int) ,那么f(c)将调用f(short)

所以总而言之,我的问题是,它与“整数提升”还是“重载解析规则”有关? 为什么?

(积分)提升优先于其他(积分)转换通过 重载解析

隐式转换序列的排序

1) 完全匹配:无需转换、左值到右值转换、限定转换、函数指针转换、(C++17 起)类类型到同一类的用户定义转换

2) 提升:积分提升、浮点提升

3) 转换:整数转换、浮点转换、浮点整数转换、指针转换、指针到成员转换、布尔转换、派生类到其基类的用户定义转换

因此,从charint的提升优于从charshort转换。


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

为什么char to short不是促销? ,你可以继续。 积分提升总是到int或更大的类型。 没有促销可以short

以下隐式转换被归类为整数提升:

  • signed char 或 signed short 可以转换为 int;

  • 如果 unsigned char 或 unsigned short 可以保存其整个值范围,则可以将其转换为 int,否则可以将其转换为 unsigned int;

  • 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。


标准参考(现行标准草案):

[over.ics.scs] § 3

[conv.prom] § 1

隐式转换(cppreference):

以下隐式转换被归类为整数提升:

  • [...]
  • char可以根据底层类型转换为intunsigned intsigned charunsigned char (见上文);
  • [...]

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM