C++ 默认字符是否已升级?

C++ 默认字符是否已升级?,c++,c,language-lawyer,integer-promotion,C++,C,Language Lawyer,Integer Promotion,这可能是一个愚蠢的问题,但请有人提供C++11和C11的标准参考: 是否将char默认升级为int? 这里有一个小背景:C和C++都有默认参数提升的概念(C++ 11:5.2.2/7;C11:5.5.2.2/2)。这需要在以下调用中提升参数: void f(int, ...); float a = 1; short int b = 2; char c = 'x'; f(0, a, b, c); 对于函数调用,a转换为double,b转换为int。但是c会发生什么呢?我一直认为char也会被

这可能是一个愚蠢的问题,但请有人提供C++11和C11的标准参考:

是否将
char
默认升级为
int

这里有一个小背景:C和C++都有默认参数提升的概念(C++ 11:5.2.2/7;C11:5.5.2.2/2)。这需要在以下调用中提升参数:

void f(int, ...);

float a = 1; short int b = 2; char c = 'x';

f(0, a, b, c);

对于函数调用,
a
转换为
double
b
转换为
int
。但是
c
会发生什么呢?我一直认为
char
也会被提升为
int
,但我在标准中找不到相关的语句。

首先,默认参数提升

6.5.2.2

如果表示被调用函数的表达式具有 不包括原型的类型,整数 对每个参数和具有浮点类型的参数执行 被提升为双倍。这些被称为默认参数 晋升

现在,整数促销:

6.3.1.1

在表达式中使用int或unsigned时,可以使用以下内容 int可用于:

  • 整数类型的对象或表达式(int或 无符号整数),其整数转换秩小于或 等于整数和无符号整数的秩
如果int可以表示原始类型的所有值(受限 根据宽度,对于位字段),值转换为整数; 否则,它将转换为无符号整数 整数促销

因此,对于C,至少一个
char
被默认提升为
int
unsigned int

C++ <>在C++ 2011(ISO/IEC 1488~2011)中,相关部分似乎是:

§5.2.2函数调用[表达式调用] ^6函数可以声明为接受更少的参数(通过声明默认参数(8.3.6))或更多 参数(通过使用省略号,…,或函数参数包(8.3.5))大于参数数量 在函数定义(8.4)中。[注:这意味着,除了省略号(…)或函数 使用参数包时,每个参数都有一个参数可用。-结束说明]

^7当给定参数没有参数时,参数的传递方式应确保接收 函数可以通过调用va_arg(18.10)获得参数的值。[注:本款不适用 应用于传递给函数参数包的参数。函数参数包在 模板实例化(14.5.3),因此当函数 模板专门化实际上被调用。-end note]左值到右值(4.1),数组到指针(4.2),以及 对参数表达式执行函数到指针(4.3)的标准转换。一个论点 已将类型std::nullptr_t转换为类型void*(4.10)。经过这些转换之后, 如果参数没有算术、枚举、指针、指向成员的指针或类类型,则 程序格式不正确。传递具有非平凡 复制构造函数、非平凡移动构造函数或非平凡析构函数,没有相应的 参数,由实现定义的语义有条件地支持

如果参数有积分 或受整数升级(4.5)约束的枚举类型,或受整数升级(4.5)约束的浮点类型 对于浮点提升(4.6),参数的值将转换为之前的提升类型 电话。这些升级称为默认参数升级

我把最后两句分开来强调。它们是标准第7段的连续部分

§4.5整体促销[conv.prom] 除了其整数转换的
bool
char16\u t
char32\u t
wchar\u t
之外的整数类型的PR值 秩(4.13)小于
int
的秩,如果
int
可以表示所有值,则可以将其转换为
int
类型的PR值 源类型的值;否则,可以将源prvalue转换为类型为
unsigned的prvalue
int

^2类型为
char16\u t
char32\u t
wchar\u t
(3.9.1)的PR值可转换为以下第一种类型的PR值: 以下类型可以表示其基础类型的所有值:
int
无符号int
长int
unsigned long int
long long int
unsigned long long int
。如果该列表中的任何类型都不能 表示其基础类型的所有值,可以使用类型为
char16\u t
char32\u t
wchar\u t
的prvalue 已转换为其基础类型的prvalue

等等


C C有两个上下文,其中参数是默认提升的。一个是当函数的范围内没有原型时(第一个答案包含在另一个答案中),第二个是当有带省略号的原型时。当然,C++根本不允许第一种情况。这些引用与另一个答案选择的标准部分相同,但这里的代码片段稍长一些。它们是通过对标准的独立分析发现的,只有在交叉检查时,我才注意到这些部分是相同的

在C 2011(ISO/IEC 9899:2011)中,相关部分似乎是:

§6.5.2.2函数调用 如果表示被调用函数的表达式的类型不包含 原型中,对每个参数执行整数提升,并且 有a型浮球