也许我对[class.access]/7的理解不正确,但是

Bel*_*loc 10 c++ protected derived-class language-lawyer c++14

从[class.access]/7我们得到以下句子:

类似地,A::B作为基本说明符的使用是良好形成的,因为它D是派生自的A,因此必须推迟对基本说明符 s的检查,直到看到整个基本说明符列表.

class A {
protected:
    struct B { };
};
struct D: A::B, A { };
Run Code Online (Sandbox Code Playgroud)

查看clang的实例.事实上,clang还抱怨这个片段,不需要延期.

class A {
protected:
    struct B { };
};
struct D: A, A::B { };
Run Code Online (Sandbox Code Playgroud)

为什么这段代码不能编译?

PS:gcc和VS21013也不编译代码.

小智 8

这只是一个编译器错误.标准的规范性文本支持该示例.多个编译器具有相同的错误的事实意味着这是标准的一部分是正确的棘手.

海湾合作委员会铿锵声都存在明显的漏洞.请注意,一些相关的案例实际上是C++ 03和C++ 11之间的细微差别,但据我所知,不是这个.

[class.access] /1.2仅表示

protected; 也就是说,它的名称只能由声明它的类的成员和朋友,从该类派生的类以及他们的朋友使用(见11.4).

并且11.4没有对此进行扩展.您正在从B该类D派生的类中使用该名称A.没关系.