【发布时间】:2015-07-20 23:22:00
【问题描述】:
N4527 5.20 [expr.const]p3
整数常量表达式是整数或无范围枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。
5.20 [expr.const]p5
常量表达式要么是一个泛左值核心常量表达式,其值是指一个实体,该实体是常量表达式(如下定义)的允许结果,要么是一个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 冲突?
【问题讨论】:
-
嗯,每个问题一个问题。一。不是五个。
-
@Lightness Races in Orbit 主要问题是 4,但如果 3 不是,则没有必要问 4,以此类推。 1、2 和 3 是 4 的一部分。
-
a是一个常量表达式,因为 [expr.const]/(2.7.1)。 -
@KerrekSB:仅当应用了左值到右值的转换时。
-
@KerrekSB
a是一个核心常量表达式,因为 [expr.const]/(2.7.1)。
标签: c++ language-lawyer constant-expression