N4527 5.20 [expr.const]p3
整型常量表达式是整型或无范围枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。
5.20 [expr.const]p5
一个常量表达式要么是一个左值核心常量表达式,其值是指一个实体,该实体是一个常量表达式(如下定义)的允许结果,要么是一个纯右值核心常量表达式,其值是一个对象,对于该对象及其子对象:
(5.1) — 每个引用类型的非静态数据成员指的是一个实体,它是一个常量表达式的允许结果,并且
(5.2) — 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、超过此类对象末尾的地址 (5.7)、函数的地址或空指针值.
如果实体是具有静态存储持续时间的对象,该对象不是临时对象或者是其值满足上述约束的临时对象,或者它是一个函数,则该实体是常量表达式的允许结果。
void foo(){
const int a = 1;//a has automatic storage duration
// all ok in gcc 5.1.0 and clang 3.8.0
int b[a]{};
static_assert(a,"");
switch(1){
case a:
;
}
}
问题1:是a
整数常量表达式吗?
问题2:是a
常量表达式吗?
问题3:glvalue整型常量表达式是常量表达式吗?
问题4:
如果问题3的答案是肯定的,如果对象具有自动存储时长,这是否与5.20 p3冲突?