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

Maybe my understanding of [class.access]/7 isn't correct, but

本文关键字:不正确 但是 class access 也许      更新时间:2023-10-16

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

类似地,使用A::B作为基说明符也是格式良好的因为D是从A派生的,所以必须检查基说明符s直到看到整个基说明符列表为止。

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也不编译代码。

这只是一个编译器错误。该标准的规范性文本支持该示例。事实上,多个编译器都有相同的错误,这意味着这是标准的一部分,很难纠正。

GCC对此存在公开的错误和叮当声。注意,一些相关的案例实际上是C++03和C++11之间的细微差异,但据我所知,不是这一个。

[class.access]/1.2仅表示

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

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

我认为这是clang的一个错误。Ideone也不接受该代码:http://ideone.com/uiFl9L:

class A {
protected:
struct B { };
};
struct D: A::B, A { };

我检查了gcc-5.1.0、gcc-4.9和clang-3.7(rc2(。标准明确指出这是一个良好的格式(见问题(,因此编译器有问题。

示例明确了[class.access]/6:

第11条中的所有访问控制都会影响从特定实体,包括所声明实体名称之前的声明部分。。。

这意味着,根据[class.access]/2,一个类可以访问所有基类,甚至在它们被声明之前。