You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:54:25