Я читаю Эта статья, и какое-то время играл с идиомой memberspace, когда заметил что-то, что удивило меня в этом фрагменте (который компилируется без проблем: http://ideone.com/hRiV5B):
class HugeClass
{
public:
struct memberspace
{
int f() const { return parent.f; }
private:
friend HugeClass;
explicit memberspace(HugeClass & parent)
: parent(parent) {}
HugeClass & parent;
} memberspace;
HugeClass() : memberspace(*this), f(42) {}
private:
int f;
};
Я бы ожидал ошибку компилятора, что доступ HugeClass::f
не допускается, потому что f
является частным в этом контексте.
HugeClass
это friend
из memberspace
, так HugeClass
может вызвать частный конструктор memberspace
, но почему это работает наоборот без явного объявления memberspace
friend
из HugeClass
?
По правилам языка в C ++ 11.
Вложенный класс является членом, и поэтому имеет те же права доступа, что и любой другой член.
Пример:class E { int x; class B { }; class I { B b; // OK: E::I can access E::B void f(E* p, int i) { p->x = i; // OK: E::I can access E::x } }; };
А в С ++ 03 было
Члены вложенного класса не имеют специального доступа ни к членам включающего класса, ни к классам или
функции, которые подарили дружбу окружающему классу; обычные правила доступа (пункт 11)
повиновался.
Итак, пример из C ++ 11 не должен работать с компиляторами c ++ 03.
memberspace
это часть HugeClass
и имеет такой же доступ, как и другие члены класса.