成员空间可以访问父类的私有成员

Memberspaces may access private members of parent class

本文关键字:成员 父类 访问 空间      更新时间:2023-10-16

我一直在读这篇文章,在玩成员空间习语有一段时间时,我注意到这个片段中有一些让我惊讶的东西(它编译起来没有问题: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在该上下文中是私有的。

HugeClassmemberspacefriend,所以HugeClass可以调用memberspace的私有构造函数,但为什么它在不显式声明memberspaceHugeClassfriend的情况下以另一种方式工作?

根据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编译器一起使用。

memberspaceHugeClass的一部分,与类的其他成员一样具有相同的访问权限。