C++ 默认字符是否已升级?
这可能是一个愚蠢的问题,但请有人提供C++11和C11的标准参考: 是否将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也会被
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或 无符号整数),其整数转换秩小于或 等于整数和无符号整数的秩
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型浮球