N4527 5.20 [expr.const] p3
整数常量表达式 是整数或未整数枚举类型的表达式,隐式转换为prvalue,其中转换后的表达式是核心常量表达式。
5.20 [expr.const] p5
常量表达式 是一个glvalue核心常量表达式,其值是指一个实体,它是一个常量表达式的允许结果(如下定义),或者prvalue核心常量表达式 value是一个对象,对于该对象及其子对象:
(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冲突?
答案 0 :(得分:0)
a
是一个整数常量表达式吗?
在以下情况中:
int b[a]{};
static_assert(a,"");
switch(1){
case a:
;
}
是的,a
是一个整数常量表达式。从你的第一句话开始:
整数常量表达式是隐式转换的整数或未整数枚举类型的表达式 到prvalue,其中转换的表达式是核心常量表达式。
'一个'是一个整数类型,在你的情况下它将被隐式转换为prvalue,所以现在a
是一个核心常量表达式?是的,如果我们回到第2段,它定义了什么不是核心常量表达式:
条件表达式e是核心常量表达式,除非e的评估遵循规则 抽象机器(1.9),将评估以下表达式之一
它有以下条款:
左值 - 右值转换(4.1),除非它适用于
有以下例外:
整数或枚举类型的非易失性glvalue,它指的是一个完整的非易失性const 具有先前初始化的对象,使用常量表达式初始化,或
适用于a
,因为它是非易失性的,const并用常量表达式初始化。
a
是一个常量表达式吗?
在与上述相同的情况下,是的,因为我们可以从上面的引文中看到它是一个核心常量表达式。
glvalue积分常量表达式是一个常量表达式吗?
不,为了使它成为一个整数常量表达式,它必须转换为prvalue,因此不能成为glvalue。