常量表达式中对象指针是否总能与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
相关产品推荐
相关产品推荐

