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



这是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

最新更新