请考虑以下代码:
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)
这是一个错误:"函数调用必须在常量表达式中具有常量值".好.
两个问题:
如果'x'被声明为静态,则没有错误.为什么?
如何在编译过程中获取变量地址?它们不是在运行时分配的吗?
指向具有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)
px是一个地址常量表达式.这是一个标准参考:
[5.19p3]:
地址常量表达式是指针类型的prvalue核心常量表达式,其计算为具有静态存储持续时间的对象的地址,函数的地址,或空指针值,或std类型的prvalue核心常量表达式: :nullptr_t.