我一直在阅读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在该上下文中是私有(private)的。
HugeClassfriendmemberspace,因此HugeClass可以调用memberspace的私有(private)构造函数,但是为什么在没有明确地将memberspace声明为friendHugeClass的情况下以其他方式工作呢?

最佳答案

根据C++ 11中的语言规则。



在C++ 03中



因此,C++ 11的示例不适用于c++ 03编译器。

09-06 19:44