N4527 5.20[表达式常量]p2
条件表达式 e 是 a核心常量表达式除非 e 的评估遵循以下规则
抽象机(1.9)将评估以下表达式之一:
(2.7) — 左值到右值的转换 (4.1) 除非它应用于
(2.7.1) —引用完整非易失性 const 的整型或枚举类型的非易失性泛左值
具有先前初始化的对象,用常量表达式初始化,或者
(2.7.2) — 引用字符串文字 (2.13.5) 的子对象的非易失性左值,或
(2.7.3) — 引用用 constexpr 定义的非易失性对象的非易失性泛左值,或者引用
到此类对象的不可变子对象,或者
(2.7.4) — 文字类型的非易失性左值,引用其生命周期开始的非易失性对象
在 e 的评估范围内;
5.20[表达式常量]p5
常量表达式可以是左值核心常量表达式其值指的是一个实体
常量表达式(如下定义)的允许结果,或纯右值核心常量表达式,其
value 是一个对象,其中对于该对象及其子对象:
— 每个引用类型的非静态数据成员引用一个实体,该实体是常量表达式的允许结果,并且
— 如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、此类对象末尾之后的地址 (5.7)、函数的地址或空指针值。
如果一个实体是一个对象,那么它就是常量表达式的允许结果静态存储时间这要么不是临时对象,要么是其值满足上述约束的临时对象,或者是一个
功能。
void foo(){
const int a = 1;//a has automatic storage duration
int b[a]{};
}
In int b[a]{};
, a
是一个 id 表达式,a
是左值核心常量表达式。是a
常量表达式?
这是一个澄清左值整型常量表达式是常量表达式吗?
a
可以是纯右值核心常量表达式,但不能是左值核心常量表达式,也不应该是可能的。您已经在标准中找到了这些措辞,因此也许最好解释一下为什么这些规则是这样的。
void foo(){
const int a = 1;//a has automatic storage duration
static constexpr const int &ra = a;// cannot possibly be valid
}
这无效,因为它需要地址a
之前为人所知foo
在那之前被叫到is any a
.
Your int b[a]{};
很好,因为它正在使用a
作为纯右值核心常量表达式:它不关心在哪里a
被存储,它只关心它有什么价值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)