通过指向成员的指针进行嵌套访问的编译时评估期间出现 GCC 错误

Han*_*lze 5 c++ gcc g++ constexpr

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
Run Code Online (Sandbox Code Playgroud)

GCC 9.4 错误消息是

error: accessing value of 'o' through a 'const int' glvalue in a constant expression
Run Code Online (Sandbox Code Playgroud)

constexpr 内部是否允许这种类型的访问?

在支持 C++11 的所有 GCC 版本上,该行为似乎都是相同的。

Fed*_*dor 0

由于该代码被 Clang 和 MSVC 接受,显然这只是一个 GCC 错误,直到 GCC 9 才显现出来,并在也接受您的代码的 GCC 10 中得到修复。演示: https: //gcc.godbolt.org/z/3EdhaK9of