以下C++ 11程序:
int x = 42;
void f()
{
int y = 43;
static_assert(&x < &y, "foo");
}
int main()
{
f();
}
Run Code Online (Sandbox Code Playgroud)
不抱怨使用gcc 4.7进行编译:
error: ‘&y’ is not a constant expression
Run Code Online (Sandbox Code Playgroud)
这符合我的直觉.y每次调用时可能会发生变化的地址f,因此在翻译过程中无法计算.
然而,5.19 [expr.const]中没有一个子弹点似乎排除了它作为一个常量表达式.
我看到的唯一两个竞争者是:
左值到左值的转换......
但除非我弄错了(?),否则程序中没有左值到右值的转换.
和
一个
id-expression引用变量[snip]的除非:
- 它用一个常量表达式初始化
这y是 - 它用常量表达式初始化43.
那么这是标准中的错误,还是我错过了什么?
更新:
令人困惑的是地狱,但我认为我处于最重要的位置,所以让我展示一个展示正在发生的事情的例子:
int x = 42;
void f()
{
int y = 43;
// address constant expressions:
constexpr int* px = &x; // OK
constexpr …Run Code Online (Sandbox Code Playgroud)