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;
或者通过在命名空间范围内声明它。
我试图在编译时通过成员指针获取对象属性的地址。以下代码在 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;
或者通过在命名空间范围内声明它。