繁体   English   中英

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

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

在[class.access] / 7中,我们有以下句子:

同样,由于D是从A派生A ,所以使用A::B作为基本说明符的格式也很正确,因此必须推迟对基本说明符 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也不编译代码。

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

对于GCCclang,存在一些与此相关的公开错误。 请注意,一些相关的情况实际上是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,这意味着一个类甚至可以在声明所有基类之前访问所有基类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM