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

用nullptr初始化的int常量指针作常量表达式,哪种编译器符合C++20标准?

C++20标准下该代码的合规性分析

根据C++20标准,GCC和Clang的行为是正确的,MSVC的行为属于非标准扩展,原因如下:

  1. static_assert的核心要求
    static_assert的断言条件必须是常量表达式,这是C++标准明确规定的强制要求。

  2. const变量在常量表达式中的使用规则
    对于仅被const修饰但未添加constexpr的变量,只有当它是整型或枚举类型,且用常量表达式完成初始化时,才能被纳入常量表达式的计算范畴。指针类型不在这个例外规则内:

  • 你的代码中ptr2是int *const(const指针),属于指针类型,即便它被nullptr(合法常量表达式)初始化,也不能直接在常量表达式中使用,除非显式声明为constexpr。
  1. 代码行为验证
    原代码中的!ptr2无法构成合法的常量表达式,因此static_assert理应触发编译错误——这正是GCC和Clang的执行逻辑。当你为ptr2添加constexpr修饰后,它成为了编译期可确定值的常量表达式变量,此时所有编译器都能正常通过编译。

  2. MSVC的特殊行为
    MSVC允许这类const指针参与常量表达式计算,是它提供的非标准扩展特性,并不符合C++20标准的官方要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:29:59