のプライベートメンバーにアクセスすることができ、私はthis articleを読んでいる、と私は(問題なくコンパイル:http://ideone.com/hRiV5B):このスニペットの中に私を驚かせた何かに気づいたとき、しばらくの間、memberspaceイディオムで遊んでたMemberspacesは、親クラス
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
はmemberspace
のfriend
なので、HugeClass
はmemberspace
のプライベートコンストラクタを呼び出すことができますが、なぜそれが明示的にHugeClass
のmemberspace
friend
を宣言しなくても、他の方法で回避しますか?
メンバー空間はHugeClassの一部とみなされ、したがってフルアクセス権を持ちます。いくつかの人気のコンパイラは、多くのための新しいルールを、次のしてきたが、2011年以前の基準は、(「入れ子になったクラスのメンバーは、囲むクラスのメンバーへの特別なアクセス権を持っていない」)反対を言ったので、これが唯一の正式ケースであることを –