这是Clang接受的,但GCC不接受:
struct inner {int x;};
constexpr struct outer {inner i;} o{};
// definition of x4 results in GCC error:
// "accessing value of 'o' through a 'const int' glvalue in a constant expression"
constexpr int x1 { &(o.i)->*(&inner::x)}; // ok
constexpr int x2 { (&o->*(&outer::i)).x }; // ok
int x3 {&(&o->*(&outer::i))->*(&inner::x)}; // ok
constexpr int x4 {&(&o->*(&outer::i))->*(&inner::x)}; // error
GCC 9.4 错误消息是
error: accessing value of 'o' through a 'const int' glvalue in a constant expression
constexpr内部是否允许这种类型的访问?
在支持 C++11 的所有 GCC 版本上,该行为似乎相同。
由于代码被 Clang 和 MSVC 接受,显然它只是一个 GCC 错误,直到 GCC 9 才表现出来,并在 GCC 10 中得到修复,它也接受您的代码。演示:https://gcc.godbolt.org/z/3EdhaK9of