相关疑难解决方法(0)

在C++ 11中将局部变量的地址作为常量表达式吗?

以下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)

c++ pointer-arithmetic language-lawyer constexpr c++11

17
推荐指数
3
解决办法
1572
查看次数