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

为何C2x标准中constexpr指针仅允许nullptr作为初始化值?

C2x中constexpr指针仅允许nullptr初始化的原因

你的代码:

int main(void)
{
    static constexpr const char *const str = "hello";
}

编译报错信息:

$ gcc -std=c2x str.c
str.c: In function 'main':
str.c:6:46: error: 'constexpr' pointer initializer is not null
    6 |     static constexpr const char *const str = "hello";
      |                                              ^~~~~~~

核心原因

C2x标准对constexpr指针的初始化规则做了严格限定:只有空指针常量(比如nullptr或字面量0)能作为constexpr指针的初始化值,根本原因在于:

  • C标准定义的编译期常量表达式不包含字符串字面量的地址。字符串字面量的存储位置是程序运行时加载到内存的,编译阶段无法确定其绝对内存地址,不属于编译期可确定的常量。
  • constexpr变量的核心要求是:初始化值必须是编译阶段就能计算出结果的常量表达式,因此字符串字面量的地址不满足这个要求,只有nullptr这种编译时就能确定为空的指针常量符合条件。

替代方案

如果只是需要一个只读的静态指针变量,用const代替constexpr即可,这在C2x中是合法的:

int main(void)
{
    static const const char *const str = "hello";
}

内容的提问来源于stack exchange,提问作者Madagascar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:50:55