具有多重继承和具有与原始声明不同的访问说明符的 using 声明的程序的实现分歧

Sup*_*mum 5 c++ multiple-inheritance using-declaration language-lawyer name-lookup

根据 C++ 标准,以下程序的格式正确还是错误?

struct A { protected: static const int x = 0; };
struct B : A {};
struct C : A { using A::x; };
struct D : B, C {};

int main() { D::x; }
Run Code Online (Sandbox Code Playgroud)

不同的编译器给出不同的结果。Clang 拒绝它,GCC 接受它:

我认为该程序格式良好(因此 clang 存在拒绝它的错误),http://eel.is/c++draft/class.paths#1,但我不确定:

如果一个名称可以通过多重继承图的多个路径到达,则访问权是提供最多访问权的路径的访问权。