2013-01-06 78 views
12

下面的示例代码private修饰符编译在Visual C++就好:C++忽视嵌套匿名结构

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

int main(int, char **) 
{ 
    Test test; 
    test.privateData = 0; 
    return 0; 
} 

但是,为什么?我期望编译器错误,因为privateData成员应该无法访问函数主,因为它应该是private像它的容器的容器。 我知道无名结构不是官方C++的一部分,但是这个设计是asinine。

顺便说一句,我也试图改变privateprotectedstructunion:它看起来像编译器拒绝兑付匿名结构和联合嵌套在另一个匿名结构或联合内部的访问修饰符。

有人可以解释这个功能吗?

+3

这听起来像是在_VS2005sp1_中修复的错误,您使用的是哪个版本?请记住,_anonymous structs_不是一个标准的_C++ _功能... –

+0

nope,我正在使用VS 2012 –

+2

@ K-ballo gcc也编译这个... –

回答

6

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

现在错误处于“无法修复”状态,目前还不清楚何时(如果有的话)它将被解决。对于它来说有一种奇怪的解决方法,爱迪生设计集团编写的内置于Visual Studio中的IntelliSense解析器对此抱怨。你会得到红色的波形和消息:

Error: member "Test.privateData" (declared at line 10) is inaccessible

+2

您是否暗示有很多开发人员在时间流逝,他们的访问说明符不能通过两级匿名结构正确级联? –

+0

@LightnessRacesinOrbit我的理解是没有成群的,但喜欢使用微软的“解决方法”的包,对于这些人他们不解决这个和类似的问题。相反,他们用他们的代码解析器 –

+0

@BЈовић标记它:在我看来,就像一个不可思议的窄边案例,这将不值得这样考虑,甚至在修复它时也没有什么好处... ... –