N4527 5.20 [表达式常量]p3
An 积分常量表达式是整型或无范围枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。
5.20 [expr.const]p5
A 常量表达式是一个泛左值核心常量表达式,其值引用作为常量表达式(如下定义)的允许结果的实体,或者是一个纯右值核心常量表达式,其
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
an 积分常量表达式?
问题2:是a
a 常量表达式?
问题3:左值整型常量表达式是常量表达式吗?
问题4:
如果问题3的答案是肯定的,
如果对象具有自动存储期限,这与 5.20 p3 冲突吗?
Is a
积分常量表达式?
在以下情况下:
int b[a]{};
static_assert(a,"");
switch(1){
case a:
;
}
yes, a
是一个整型常量表达式。从你的第一句话开始:
整型常量表达式是整型或无作用域枚举类型的表达式,隐式转换
到纯右值,其中转换后的表达式是核心常量表达式。
'a' 是一个整型,在你的情况下它将被隐式转换为纯右值,所以现在是a
核心常量表达式?是的,如果我们回到第 2 段,它定义了什么不是核心常量表达式:
条件表达式 e 是核心常量表达式,除非对 e 的求值遵循以下规则:
抽象机(1.9),将评估以下表达式之一
它有以下条款:
左值到右值的转换(4.1),除非它应用于
但以下情况除外:
引用完整非易失性 const 的整型或枚举类型的非易失性泛左值
具有先前初始化的对象,用常量表达式初始化,或者
这适用于a
因为它是非易失性的,所以是 const 并用常量表达式初始化。
Is a
常量表达式?
在与上面相同的上下文中,是的,因为我们可以从上面的引用中看到它是一个核心常量表达式。
左值整型常量表达式是常量表达式吗?
不,为了使其成为整型常量表达式,必须将其转换为纯右值,因此不能是左值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)