5

我一直在阅读这篇文章,并且正在使用 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在该上下文中是私有的。

HugeClassis a friendof memberspace,所以HugeClass可以调用 of 的私有构造函数memberspace,但是为什么它在没有明确声明memberspacea friendof 的情况下反其道而行之HugeClass

4

2 回答 2

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

于 2013-07-17T12:19:27.130 回答
1

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

于 2013-07-17T12:24:04.867 回答