根据 [class.access]/7,我们有以下句子:
同样地,使用
A::B
作为 base-specifier 是合法的, 因为D
是从A
派生而来的,所以必须推迟检查 base-specifier, 直到整个 base-specifier-list 被看到。
class A {
protected:
struct B { };
};
struct D: A::B, A { };
点击此处查看clang的实时示例。事实上,clang也对这个片段提出了抱怨,其中不需要推迟执行。
class A {
protected:
struct B { };
};
struct D: A, A::B { };
为什么这段代码无法编译?
PS:gcc和VS21013也无法编译此代码。
D
派生自A
,因此它可以访问A
的受保护成员。 - Bellocprotected
的整个意义在于派生类 可以 看到该名称。如果您不希望该名称在定义类之外可见,则可以使用private
关键字。 - user743382