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

常量表达式中对象指针是否总能与nullptr进行比较?

问题:常量表达式中临时对象的this指针与nullptr比较的合法性

struct A包含一个constexpr成员函数,用于将this指针与成员指针a(初始为nullptr)进行比较。随后在static_assert中对临时对象调用该成员函数,代码如下:

struct A {
    A * a = nullptr; // 实际程序中该指针可被修改
    constexpr bool f() {
        return a != this;
    }
};

static_assert( A{}.f() );

Clang和MSVC可正常编译这段代码,但GCC会报错,错误信息如下:

<source>:8:21: error: non-constant condition for static assertion
    8 | static_assert( A{}.f() );
      |                ~~~~~^~
<source>:4:18: error: '((&<anonymous>) != 0)' is not a constant expression
    4 |         return a != this;

回答

这段程序是格式良好的,在常量表达式中比较指针前不需要专门检查是否为nullptr。

根据C++标准,常量表达式中允许进行对象指针与nullptr的比较操作。这里临时对象的this指针指向的是常量表达式求值过程中创建的临时对象,属于合法的指针值,与nullptr的比较完全符合常量表达式的要求。

GCC的报错属于编译器实现层面的问题,并非代码本身违反C++标准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:29:55