C++ GCC要求此引用声明使用constexpr说明符是否正确?

C++ GCC要求此引用声明使用constexpr说明符是否正确?,c++,gcc,language-lawyer,c++14,constexpr,C++,Gcc,Language Lawyer,C++14,Constexpr,下面的代码没有在下编译,因为r的声明缺少constepr说明符 const int i = 1; const int& r = i; constexpr int j = r; 我相信拒绝是正确的。我如何使用工作草案N4527证明它?首先,因为我们使用的是一个引用,[expr.const]/(2.9)不得违反。(2.9.1)适用,但: 引用的变量或数据成员的id表达式 引用类型,除非该引用具有前面的初始化和 -使用常量表达式初始化 也就是说,只要初始值设定项-I-是一个常量表达式(如下所

下面的代码没有在下编译,因为
r
的声明缺少
constepr
说明符

const int i = 1;
const int& r = i;
constexpr int j = r;

我相信拒绝是正确的。我如何使用工作草案N4527证明它?

首先,因为我们使用的是一个引用,[expr.const]/(2.9)不得违反。(2.9.1)适用,但:

引用的变量或数据成员的id表达式 引用类型,除非该引用具有前面的初始化和
-使用常量表达式初始化

也就是说,只要初始值设定项-
I
-是一个常量表达式(如下所示),就可以使用
r

还需要检查第3行中的l-t-r转换是否合法,即不得违反(2.7)。但是,(2.7.1)适用于:

左值到右值的转换(4.1),除非它应用于
-a 引用的整型或枚举类型的非易失性值 一个完整的非易失性
const
对象,前面有一个 初始化,使用常量表达式初始化,或

…这也没关系,因为(g)左值是
r
,它指的是
i
-这是一个非易失性
常量
对象,具有常量表达式初始值设定项(
1

我们推迟了显示
i
实际上是一个常量表达式的时间,一旦排除了这个问题,我们需要显示
r
是一个常量表达式。
[expr.const]/5适用于:

常量表达式是glvalue或core常量表达式 其值指的是一个实体,该实体是 常量表达式(定义见下文)或prvalue核心常量 值为对象的表达式,其中,对于该对象及其 子对象:

  • 引用类型的每个非静态数据成员引用一个实体,该实体是常量表达式的允许结果,并且
  • 如果对象或子对象为指针类型,则它包含具有静态存储持续时间的对象的地址,即过去的地址 这种对象(5.7)的结尾、函数的地址或空值 指针值
如果实体是静态存储持续时间为 不是临时对象,或者是其值满足上述约束的临时对象,或者是 功能

因为在上面的上下文中,
i
是一个(g)左值,所以它必须是一个常量表达式的允许结果——它是,因为它具有静态存储持续时间,当然不是临时的。因此,
i
是一个常量表达式

然而,
r
在第3行中被视为PR值。因为我们已经确定
r
是一个核心常量表达式,所以我们只需要检查要点。不过,他们显然见过面


因此,代码在名称空间范围内格式良好。它将不在局部范围内,因为
i
不再是常量表达式的允许结果

这个代码。你仍然需要证明
r
是用一个常量表达式初始化的。为了证明
i
是一个常量表达式,您必须证明
i
的值引用了一个实体,该实体是常量表达式的允许结果,根据§5.20/5的规定。@Belloc这几乎是微不足道的,因此在我的回答中不是。它可能对您来说微不足道,而对我来说则不然。@Belloc好的,我添加了它。:-)但该子句表示
,其值指的是一个实体
,而
i
的值为1。然后我问:1如何表示一个实体,它是一个具有静态存储持续时间的对象。。。?