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