gcc 不能通过成员指针获取属性的 constexpr 地址?

gcc can't take constexpr address of attribute through member pointer?

我试图在编译时通过成员指针获取对象属性的地址。以下代码在 MSVC 上编译良好,但在 GCC 上编译失败:

#include <optional>

struct S {
    int i = 42;
};

int main() {
    constexpr S obj;
    constexpr auto member = &S::i;
    constexpr auto ptr = std::optional(member);

    // OK
    constexpr auto value = obj.*(*ptr);
    static_assert(value == 42);

    // Doesn't compile on gcc, can't take address through member pointer
    constexpr auto & attr = obj.*(*ptr);
    static_assert(attr == obj.i);
}

GCC 给出以下错误:

<source>:17:39: error: '(const int&)(& obj)' is not a constant expression
17 |     constexpr auto & attr = obj.*(*ptr);

编译器资源管理器中的代码如下:https://godbolt.org/z/4WhW3qd7c

我在这里找不到关于哪个编译器出错的信息。任何人都可以阐明这一点吗?

左值常量表达式的结果只能引用具有静态存储持续时间的对象。

obj 没有静态存储持续时间,因为它是在块范围内声明的。

您可以通过在块范围内添加 static 关键字来提供 obj 静态存储持续时间:

static constexpr S obj;

或者通过在命名空间范围内声明它。