为何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
相关产品推荐
相关产品推荐

