提问者:小点点

为什么为常量表达式定义术语的规则必须如此混乱?


我不明白为什么一个由prvalue core常量表达式引用的临时对象必须没有任何指针或引用,这些指针或引用指向或引用存储持续时间不是静态的对象,以便prvalue core常量表达式成为常量表达式;参见N4296[expr. const]5.20\5。

我认为实现可以像这样重写该规则:

[expr. const]5.20\5(修改)

核心常量表达式e是常量表达式,除非它初始化一个对象以使其包含一个指针,该指针指向存储持续时间不是静态的对象。

如果不是,有人能解释一下为什么吗?


共1个答案

匿名用户

它指向一个存储持续时间不是静态的对象

  1. 您排除了空指针
  2. 您排除了函数指针

从标准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)缺少它。
  • 在您的规则
  • 中没有提到对具有静态存储持续时间的对象的引用