N4527 5.20 [expr.const]p3
整数常量表达式是指具有整数或无作用域枚举类型的表达式,隐式转换为prvalue,并且转换后的表达式是核心常量表达式。
5.20 [expr.const]p5
常量表达式指的是以下定义的常量表达式的值引用一个被允许的常量表达式实体的glvalue(其中该实体可以是一个非静态数据成员)或者一个其值为对象的prvalue 的核心常量表达式,对于该对象及其子对象:
(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相冲突?
a
是一个核心常量表达式,因为它满足[expr.const]/(2.7.1)。 - stackcpp