C++14 中的§5.19/3 定义了整型常量表达式和转换常量表达式:
An 积分常量表达式是积分或的表达式
无范围枚举类型,隐式转换为纯右值,其中
转换后的表达式是核心常量表达式。 [ 注:此类
表达式可以用作数组边界(8.3.4、5.3.4)、位字段
长度 (9.6),作为枚举器初始值设定项(如果基础类型是)
不固定(7.2),并且作为对齐(7.6.2)。 ——尾注] A转换的
常量表达式类型的T
是一个隐含的表达式
转换为类型的纯右值T
,其中转换后的表达式是
核心常量表达式和隐式转换序列
仅包含用户定义的转换、左值到右值的转换
(4.1)、积分促销 (4.5) 和积分兑换 (4.7) 其他
比缩小转换(8.5.4)。 [注:这样的表达方式可能是
用于new
表达式(5.3.4),如case
表达式 (6.4.2),如
如果基础类型是固定的(7.2),则枚举器初始值设定项如下
数组边界 (8.3.4),以及作为整数或枚举非类型模板
论据(14.3)。 ——尾注]
也许我错过了一些东西,但我的第一印象是每个积分常量表达式 is a 转换后的常量表达式.
Edit
而且我也认为这一段有一个错误:
代替:
A converted constant expression of type T is an expression, implicitly converted to a prvalue of type T, ...
它应该是:
A converted constant expression of type T is an expression, implicitly converted to a prvalue of an integral type, ...
此更改允许编译以下代码:
#include <iostream>
struct A { operator int() { return 5; } } a;
int main() {
int b[a]{ 0, 1, 2, 3, 4 };
std::cout << b[4] << '\n';
}
where a
在声明中int b[a]{ 0, 1, 2, 3, 4};
is a 转换后的常量表达式类型的A
,隐式转换为整数类型的纯右值 (int
) 其中转换后的表达式5
is a 核心常量表达式,并且隐式转换序列仅包含用户定义的转换。