常量表达式中的对象指针是否可以始终与 nullptr 进行比较?

问题描述 投票:0回答:1

减少以下程序来演示该问题。

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

c++ pointers language-lawyer constexpr rvalue
1个回答
0
投票

这只是一个 GCC bug:当然,在不断求值期间构造的临时变量的(符号)地址是该求值已知的。

© www.soinside.com 2019 - 2024. All rights reserved.