为何constexpr局部变量的地址无法作为常量表达式?
为什么constexpr函数内无法将局部constexpr变量的地址声明为constexpr指针?
问题里的代码编译失败,核心原因是C++标准对constexpr指针的指向有严格限制,具体逻辑如下:
- 局部
constexpr int i = 5;虽然是编译期常量,但它属于自动存储期(函数调用时在栈上分配),它的内存地址只有在程序运行、函数被调用时才能确定,编译阶段无法固定这个地址值。 - constexpr变量要求其值必须是编译期可确定的常量表达式,而指针类型的constexpr变量,只能指向以下几种对象:
- 具有静态存储期的常量表达式(比如全局constexpr变量、
static constexpr局部变量) - nullptr
- 某个完整对象的起始地址,且该对象本身是常量表达式的一部分(比如全局数组的元素地址)
- 具有静态存储期的常量表达式(比如全局constexpr变量、
当你尝试声明constexpr auto ptr = &i;时,&i并不是一个有效的编译期常量表达式——因为i的地址编译期没法确定,所以这个赋值不符合constexpr的要求,编译器会报错。
而如果去掉ptr的constexpr修饰,它就只是一个普通的const int*指针,赋值操作会在函数调用的运行阶段(哪怕是constexpr函数的运行期求值阶段)完成,此时i已经有了确定的内存地址,所以代码可以正常编译运行。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

