gpt4 book ai didi

c++ - 为什么用 constexpr 声明的引用可以绑定(bind)到 Indeterminate 值变量?

转载 作者:行者123 更新时间:2023-12-04 16:24:05 25 4
gpt4 key购买 nike

int aaa;
int& v = aaa;
int& rf = v;
constexpr int& crf = rf;
int main(){
}

我想知道为什么所有编译器都同意这个示例格式正确? constexpr 变量不应该具有在编译器期间可以知道的值吗?既然 aaa 的值是 Indeterminate 值,为什么这个例子能被编译器接受?

最佳答案

对于这个例子,在我看来这相当于问为什么变量 rf 可以在常量表达式中使用。根据 [dcl.constexpr#10],crf 初始化的完整表达式应该是一个常量表达式。根据[expr.const#11]

A constant expression is either a glvalue core constant expression that refers to an entity that is a permitted result of a constant expression (as defined below), or a prvalue core constant expression whose value satisfies the following constraints

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

在这种情况下,由于引用绑定(bind)应该绑定(bind)到一个glvalue,因此rf应该是一个glvalue核心常量表达式;由于 rf 指的是对象 aaa 具有静态存储时长,因此我们只需要检查 rf 是否为核心常量表达式,这是确定的通过 [expr.const#5]。由于 rf 是引用类型的 id-expression,因此它应满足 [expr.const#5.12]

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 usable in constant expressions or
  • its lifetime began within the evaluation of E;

这里必须满足在常量表达式中可用,由[expr.const#4]决定

A constant-initialized potentially-constant variable V is usable in constant expressions at a point P if V's initializing declaration D is reachable from P and

  • V is constexpr,
  • V is not initialized to a TU-local value, or
  • P is in the same translation unit as D.

一个对象或引用可以在常量表达式中使用

  • a variable that is usable in constant expressions, or

由于 rf 是一个引用,因此由于 [expr.const#3]

它可能是常数

A variable is potentially-constant if it is constexpr or it has reference or const-qualified integral or enumeration type.

是否常量初始化由[expr.const#2]决定

A variable or temporary object o is constant-initialized if

  • [2.1] either it has an initializer or its default-initialization results in some initialization being performed, and
  • [2.2] the full-expression of its initialization is a constant expression when interpreted as a constant-expression...

rf 的声明有一个初始化器,2.1 条为真,目前为止,rf 是否是一个常量表达式已经转向检查它的全表达式是否的初始化是一个常量表达式。同样,v 应该是一个常量表达式;判断v是否为常量表达式的过程与上面给出的rf的过程类似。进而判断初始化器 aaa 是否为常量表达式,我说是,因为 aaa 是静态存储时长对象,对其求值不会违反任何定义的规则在 [expr.const#5] 中,因此它是一个泛左值核心常量表达式。因此,v 可用于常量表达式,这意味着 rf 也可用于常量表达式。总之,crf的初始化全表达式是一个常量表达式。

另外,无论rfv,还是aaa,都作为glvalue核心常量表达式,因此在这个例子中它的值并不重要。

关于c++ - 为什么用 constexpr 声明的引用可以绑定(bind)到 Indeterminate 值变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68708441/

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