为何C++不允许在编译期获取constexpr数组的地址?
问题解析
先看你给出的代码:
int main() { constexpr char ch[64] = "Hello"; auto res1 = ch; constexpr auto res2 = ch; }
核心原因
res1 = ch编译通过的原因:
这里ch会隐式转换为指向数组首元素的指针,这个转换是运行时操作。哪怕ch是constexpr初始化的局部数组,它的存储位置在当前函数的栈帧上,运行时栈帧分配完成后才能确定具体地址,此时取地址是完全合法的运行时行为。constexpr auto res2 = ch编译失败的原因:constexpr变量的初始化器必须是常量表达式,而局部constexpr数组的地址并不属于常量表达式。C++标准明确规定,局部变量(即便用constexpr修饰)的地址无法在编译期确定具体值——栈地址由程序运行时的栈帧分配逻辑决定,编译阶段无法预知,因此不能用来初始化constexpr变量。
补充验证
如果将ch移到全局/命名空间作用域:
constexpr char ch[64] = "Hello"; int main() { constexpr auto res2 = ch; // 此时编译通过 }
因为全局变量的地址在链接阶段就已确定,属于常量表达式范畴,所以可以用来初始化constexpr变量。
内容的提问来源于stack exchange,提问作者Wei Li
相关产品推荐
相关产品推荐

