在嵌套匿名结构上忽略 C++ 私有修饰符

Posted

技术标签:

【中文标题】在嵌套匿名结构上忽略 C++ 私有修饰符【英文标题】:C++ private modifier ignored on nested anonymous struct 【发布时间】:2012-12-20 16:36:48 【问题描述】:

以下示例代码在 Visual C++ 中编译得很好:

class Test 
private:
    struct 
        struct 
            int privateData;
        ;
    ;
;

int main(int, char **)

    Test test;
    test.privateData = 0;
    return 0;

但是为什么呢?我预计会出现编译器错误,因为函数 main 应该无法访问 privateData 成员,因为它应该是 private 就像它的容器的容器一样。 我知道无名结构不是官方 C++ 的一部分,但这种设计是愚蠢的。

顺便说一句,我还尝试将 private 更改为 protectedstruct 更改为 union:看起来编译器拒绝尊重嵌套在另一个匿名结构和联合中的访问修饰符结构或联合。

谁能解释一下这个功能?

【问题讨论】:

这听起来像是VS2005sp1中修复的bug,你用的是哪个版本?请记住,匿名结构不是标准的C++特性... @K-ballo gcc 也编译这个... 顺便说一句,智能感知确实会抱怨,但它仍然可以编译 Clang 4.0 编译时出现错误“错误:'privateData' is a private member of 'Test'” 如果您将private: 放在第一个匿名结构中,然后在其下嵌套许多匿名结构,则它可以正常工作。答案似乎是:“这是一个错误。” 【参考方案1】:

是的,这是一个错误。微软承认是,反馈报告is here。

目前,该错误处于“无法修复”状态,尚不清楚何时(如果有的话)会得到解决。有一个有点奇怪的解决方法,由 Edison Design Group 编写的 Visual Studio 中内置的 IntelliSense 解析器确实抱怨它。您会看到红色曲线和消息:

错误:成员“Test.privateData”(在第 10 行声明)不可访问

【讨论】:

您是否暗示有大量开发人员及时被替换,他们依赖访问说明符没有正确地通过两级匿名结构进行级联? @LightnessRacesinOrbit 我的理解是没有部落,而是喜欢使用微软“变通办法”的包,对于这些人,他们不会解决这个问题和类似问题。相反,他们用他们的代码解析器标记它 @BЈовић:在我看来,这只是一个难以置信狭窄的边缘案例,不值得考虑,即使也有争议修复它没有什么好处...... @LightnessRacesinOrbit 好。我们同意:) @LightnessRacesinOrbit 就像 Luchian Grigore 在对问题的评论中指出的那样,这个“错误”可以在 gcc 中成功重现。在我看来,这绝不是偶然的问题,兼容性要求可能是支持当前设计的一个很好的理由。

以上是关于在嵌套匿名结构上忽略 C++ 私有修饰符的主要内容,如果未能解决你的问题,请参考以下文章

kotlin学习之类的修饰符与抽象类,嵌套类,内部类,匿名内部类

Java中私有静态嵌套类中的访问修饰符

Java入门系列之访问修饰符作用范围

成员类访问修饰符

Scala访问修饰符

Kotlin基础-可见修饰符嵌套类