我不明白为什么一个由prvalue core常量表达式引用的临时对象必须没有任何指针或引用,这些指针或引用指向或引用存储持续时间不是静态的对象,以便prvalue core常量表达式成为常量表达式;参见N4296[expr. const]5.20\5。
我认为实现可以像这样重写该规则:
[expr. const]5.20\5(修改)
核心常量表达式e是常量表达式,除非它初始化一个对象以使其包含一个指针,该指针指向存储持续时间不是静态的对象。
如果不是,有人能解释一下为什么吗?
它指向一个存储持续时间不是静态的对象
从标准5.20\5:
(5.2)如果对象或子对象是指针类型,它包含具有静态存储持续时间的对象的地址、此类对象末尾的地址(5.7)、函数的地址或空指针值
(5.1)每个引用类型的非静态数据成员都指一个实体,该实体是常量表达式的允许结果
我敢打赌glvalue core常量表达式
和prvalue core常量表达式
还有一个额外的细微差别(据我所知,这个短语排除了xvalue
的一些内容),但我无法理解它。我希望有人能解释这一点。
常量表达式要么是一个glvalue core常量表达式,其值引用一个实体,该实体是常量表达式(定义如下)的允许结果,要么是一个prvalue core常量表达式,其值是一个对象
编辑
那么这有什么问题呢?还有其他规则,你知道的:5.20\2.7,2.9,2.13,2.19,2.5; etc.;)
是的,5.20/2.9是关于引用的(其他提到的规则不适用于引用类型——据我所知)。让我们阅读它。
(2)条件表达式e是核心常量表达式,除非e的求值遵循抽象机(1.9)的规则,将求值以下表达式之一:
(2.9)引用类型的变量或数据成员的id表达式,除非引用具有先前的初始化并且
-(2.9.1)它是用常量表达式初始化的,或者
-(2.9.2)它是对象的非静态数据成员,其生命周期始于e的求值;
现在让我们比较一下你的规则和标准。标准在5.20/2.9中添加了一些细节。
5.20/5
(5.1)引用类型的每个非静态数据成员都指的是一个实体,该实体是一个常量表达式的允许结果
如果一个实体是一个具有静态存储持续时间的对象,它不是一个临时对象,或者是一个值满足上述约束的临时对象,或者它是一个函数,那么它就是一个常量表达式的允许结果。
函数
(就像指针一样)-您的规则(基于5.20/2.9)缺少它。对象的引用