减少以下程序来演示该问题。
struct A
有一个 constexpr
成员函数,用于将 this
与某个指针进行比较,该指针可以是 nullptr
。然后为常量表达式内的临时对象(获取右值的地址)调用此成员函数:
struct A {
A * a = nullptr; // in real program this pointer can be changed
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;
在线演示:https://gcc.godbolt.org/z/evK1Y1r8e
这是一个结构良好的程序吗?或者在常量表达式中进行比较之前是否始终需要检查指针是否不是
nullptr
?
这只是一个 GCC bug:当然,在不断求值期间构造的临时变量的(符号)地址是该求值已知的。