我一直在阅读this article,当我在这个片段中注意到令我感到惊讶的事情时,我正在玩成员空间习惯用了一段时间(编译没有问题: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
的{{1}},因此memberspace
可能会调用HugeClass
的私有构造函数,但为什么它会以相反的方式工作明确声明memberspace
memberspace
friend
?{/ p>
答案 0 :(得分:6)
按照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 } }; };
在C ++ 03中
嵌套类的成员无法访问封闭类的成员,也无法访问类或 已经给封闭类授予友谊的函数;通常的准入规则(第11条)应为 服从。
因此,C ++ 11中的示例不适用于c ++ 03编译器。
答案 1 :(得分:1)
memberspace
是HugeClass
的一部分,与其他类成员具有相同的访问权限。