有点担心constexpr功能

Enz*_*zos 12 c++ c++11

请考虑以下代码:

constexpr const int* address(const int& r)
{
   return &r;
}


int main()
{
   int x = 10;
   constexpr const int* p = address(x); //error

   _getch();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是一个错误:"函数调用必须在常量表达式中具有常量值".好.

两个问题:

  1. 如果'x'被声明为静态,则没有错误.为什么?

  2. 如何在编译过程中获取变量地址?它们不是在运行时分配的吗?

Cal*_*eth 11

如果'x'被声明为静态,则没有错误.为什么?

这是因为程序中总是只有一个x.它有一个地址(.data在正常条件下的某个部分).

令人困惑的是,两者staticextern关键字都将存储持续时间指定为静态(它们的链接不同)

如何在编译过程中获取变量地址?它们不是在运行时分配的吗?

具有自动,动态或线程存储持续时间的变量在运行时分配.静态持续时间变量由编译器分配.(链接器和操作系统可以更改位置,但是他们知道如何修复所有引用)


Bat*_*eba 6

指向具有static存储持续时间的变量的指针 a constexpr.您可以在以下程序中看到:

int main() {
    static int x;
    int y;
    constexpr int* px = &x; // Compilation is successful
    constexpr int* py = &y; // Compilation will fail
}
Run Code Online (Sandbox Code Playgroud)

请参阅https://ideone.com/lc9u3E

px是一个地址常量表达式.这是一个标准参考:

[5.19p3]:

地址常量表达式是指针类型的prvalue核心常量表达式,其计算为具有静态存储持续时间的对象的地址,函数的地址,或空指针值,或std类型的prvalue核心常量表达式: :nullptr_t.