gpt4 book ai didi

c++ - GCC 在要求此引用声明的 constexpr 说明符方面是否正确?

转载 作者:可可西里 更新时间:2023-11-01 18:27:08 24 4
gpt4 key购买 nike

下面的代码不能在 GCC 5.3.0 下编译因为 r 的声明缺少 constexpr 说明符。

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

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

最佳答案

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

an id-expression that refers to a variable or data member of reference type unless the reference has a preceding initialization and either
— it is initialized with a constant expression

即使用 r 没问题,只要初始化器 - i - 是常量表达式(如下所示)。
还需要检查第 3 行中的 l-t-r 转换是否合法,即不得违反 (2.7)。但是,(2.7.1) 适用:

an lvalue-to-rvalue conversion (4.1) unless it is applied to
— a non-volatile glvalue of integral or enumeration type that refers to a complete non-volatile const object with a preceding initialization, initialized with a constant expression, or

...所以这也很好,因为 (g)lvalue 是 r,它指的是 i - 这是一个非 volatile const 具有常量表达式初始值设定项 (1) 的对象。

我们推迟了显示 i 实际上是一个常量表达式,一旦这不碍事,我们需要显示 r 是一个常量表达式。
[expr.const]/5 与此有关:

A constant expression is either a glvalue core constant expression whose value refers to an entity that is a permitted result of a constant expression (as defined below), or a prvalue core constant expression whose value is an object where, for that object and its subobjects:

  • each non-static data member of reference type refers to an entity that is a permitted result of a constant expression, and
  • if the object or subobject is of pointer type, it contains the address of an object with static storage duration, the address past the end of such an object (5.7), the address of a function, or a null pointer value.

An entity is a permitted result of a constant expression if it is an object with static storage duration that is either not a temporary object or is a temporary object whose value satisfies the above constraints, or it is a function.

由于 i 在上述上下文中是 (g)lvalue,因此它必须是常量表达式的允许结果 - 它是,因为它具有静态存储持续时间并且肯定不是'一个临时的。因此 i 是一个常量表达式。

然而,

r 在第 3 行中被视为纯右值。由于我们已经确定 r 是核心常量表达式,因此我们只需要检查要点.不过,他们显然已经见面了。

因此代码在命名空间范围内的格式良好。它不会在本地范围内,因为 i 不再是常量表达式的允许结果。 Clang gives a comprehensive error message .

关于c++ - GCC 在要求此引用声明的 constexpr 说明符方面是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com