将左值到右值转换应用于变量“x”不会在下面的代码中产生常量表达式。这是为什么?

Applying the lvalue-to-rvalue conversion to variable `x` does not yield a constant expression in the code below. Why is that?

下面的代码片段来自 Hubert Tong DR 2083

extern int globx;
int main() {
    const int &x = globx;
    struct A {
        const int *foo() { return &x; }
    } a;
    return *a.foo();
}

然后作者写道:

x satisfies the requirements for appearing in a constant expression, but applying the lvalue-to-rvalue converstion to x does not yield a constant expression.

为什么将左值到右值转换应用于 x 不会产生常量表达式?

将左值到右值转换应用于 x 读取可变全局变量 globx 的值,这使得它不是常量表达式,因为 globx 的值是可能会发生变化(并且,即使它是 const,也会存在其值在编译时未知的问题)。当然,这并不奇怪:没有人会认为 int{x} 是一个常量表达式。 DR 指出,尽管如此,这个事实应该不会导致 x 的 odr-use,因此代码应该是格式良好的:因为 x 具有常量初始化,编译器可以只翻译 &x 变成 &globx.