我一直在阅读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)的。HugeClass
是friend
的memberspace
,因此HugeClass
可以调用memberspace
的私有(private)构造函数,但是为什么在没有明确地将memberspace
声明为friend
的HugeClass
的情况下以其他方式工作呢? 最佳答案
根据C++ 11中的语言规则。
在C++ 03中
因此,C++ 11的示例不适用于c++ 03编译器。