Этот код компилируется на 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 получает доступ к "защищенному" разделу охватывающего класса, хотя он не объявляется как друг.
Является ли это стандартным (стандартно-совместимым) поведением?
Я иногда использую эту функцию, но я не помню правила о том, что вложенный защищенный класс должен автоматически получить доступ ко всем защищенным данным окружающего класса.