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 版本上,该行为似乎都是相同的。
由于该代码被 Clang 和 MSVC 接受,显然这只是一个 GCC 错误,直到 GCC 9 才显现出来,并在也接受您的代码的 GCC 10 中得到修复。演示: https: //gcc.godbolt.org/z/3EdhaK9of