N4527 5.20[expr.const]p2
条件表达式 e 是核心常量表达式,除非按照抽象机 (1.9) 的规则对 e 的求值将求值以下表达式之一:
(2.7) — 左值到右值的转换 (4.1),除非它应用于
(2.7.1) —一个整数或枚举类型的非易失性左值,它引用一个完整的非易失性常量对象,该对象具有前面的初始化,用常量表达式初始化,或
(2.7.2) — 引用字符串字面量 (2.13.5) 的子对象的非易失性泛左值,或
(2.7.3) — 一个非易失性泛左值,它指代用 constexpr 定义的非易失性对象,或指代此类对象的非可变子对象,或
(2.7.4) — 文字类型的非易失性左值,指的是一个非易失性对象,其生命周期开始于对 e 的评估;
5.20[expr.const]p5
一个常量表达式要么是一个左值核心常量表达式,其值是指一个实体,该实体是一个常量表达式(如下定义)的允许结果,要么是一个纯右值核心常量表达式,其值是一个对象,对于该对象及其子对象:
— 每个引用类型的非静态数据成员都引用一个实体,该实体是一个常量表达式的允许结果,并且
— 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾的地址 (5.7)、函数的地址或空指针值。
如果实体是具有静态存储持续时间的对象,该对象不是临时对象或者是其值满足上述约束的临时对象,或者它是一个函数,则该实体是常量表达式的允许结果。
void foo(){
const int a = 1;//a has automatic storage duration
int b[a]{};
}
In int b[a]{};
,a
是一个 id 表达式,a
是一个左值核心常量表达式。是a
常量表达式吗?