这段代码可以在MSVC/G++上编译:
class A{
protected:
int i;
class B{
public:
A* a;
B(A* a_)
:a(a_){
}
void doSomething(){
if (a)
a->i = 0;//<---- this part
}
};
public:
A()
:i(0){
}
};
正如您所看到的,虽然它没有被声明为友元,但B可以访问封闭类的“protected”部分。
这是标准(符合标准)的行为吗?
我有时使用这个特性,但我不记得有规定说嵌套的受保护类应自动获得对封闭类的所有受保护数据的访问权限。