1. ホーム
  2. c++

[解決済み] C++のインナークラスは自動的に友達になるのか?

2023-07-15 18:17:59

質問

C++で内部クラスを定義した場合、それを含むクラスは自動的に友人となるのでしょうか? 例えば、これは合法でしょうか。

class Outer {
public:
    class Inner {
    public:
        void mutateOuter(Outer& o);
    };

private:
    int value;
};

void Outer::Inner::mutateOuter(Outer& o) {
    o.value ++; // Legal?  Or not?
}

私が試したいくつかのコンパイラ (VS2003) では、このコードは動作しませんが、いくつかのコンパイラでは動作するということを少なくとも逸話として聞いたことがあるので質問します。 このことについて C++ 仕様に関連するセクションを見つけることができず、誰かがこれが合法か合法でないかを示す特定の何かを引用できれば、それは素晴らしいことです。

どのように解決するのですか?

同じような質問をした後 ここで で質問した後、C++11 用に更新された (ように見える) 答えを共有したいと思いました。

引用元 https://stackoverflow.com/a/14759027/1984137 :

スタンダード $11.7.1

ネストされたクラスはメンバーであり、他のメンバーと同じアクセス権を持ちます。 他のメンバと同じアクセス権を持ちます。包含するクラスのメンバは、入れ子クラスのメンバに対して特別なアクセス権を持ちません。 通常のアクセスルールに従わなければなりません。 に従わなければなりません。

と通常のアクセスルールに明記されています。

クラスのメンバは、そのクラスがアクセスできるすべての名前にアクセスすることができます... "。 にアクセスすることができます..."。

のように、具体的な例が規格で示されています。

class E {
    int x;
    class B { };

    class I {
        B b; // OK: E::I can access E::B
        int y;
        void f(E* p, int i) {
            p->x = i; // OK: E::I can access E::x
        }
    };
}