请考虑: class C { private: class T {int a, b;}; }; C::T *p; 正如预期的那样,这会产生一个编译错误,指出在第6行的上下文中,C::T是私有的。 现在将其更改为成员指针: class C { private: class T {int a, b;}; }; int C::T::*p; 这一次,gcc版本3.2.3仍然发出相同的警告,但是gcc版本3.4.3则让它通过了。根据标准,哪个是正确的行为?
为了补充xtofl的发言,请参阅标准的第11章([class.access]):一个类的成员可以是:- 私有的,即其名称只能由该类的成员和友元使用声明。 - 受保护的,即其名称只能由该类的成员和友元以及从该类派生的类的成员和友元使用(参见11.5)。 - 公共的,即其名称可以在任何地方使用而没有访问限制。