8

次のコードがあります。

class Base
{
  private:
    class NestedBase
    {
      public:
        void Do() {}
    };

  public:
    NestedBase nested;
};

int main()
{
  Base b;
  b.nested.Do(); // line A compiles
  Base::NestedBase instance; // line B doesn't compile
}

NestedBaseclass は のプライベートな入れ子クラスなBaseので、B 行がコンパイルされないのは当然のようです。しかし一方で、 variablebには public memberがあり、 (行 A のように)外部からnestedそのメソッドを呼び出すことができます。そのような場合、ネストされたプライベート クラス (またはそのメンバー) へのアクセスを規制する正確な規則は何ですか? 規格はこれについて何と言っていますか?Do()Base

4

2 に答える 2

6

標準によると、$11.7/1 ネストされたクラス [class.access.nest] :

ネストされたクラスはメンバーであるため、他のメンバーと同じアクセス権を持ちます。

だから、それは非常に簡単です。NestedBaseprivateclass のメンバーであるBaseため、 ではBase::NestedBaseアクセスできませんmain()

b.nested.Do();nestedDo()はどちらもpublicメンバーであるため、問題ありません。のネストされたクラスでNestedBaseあるという事実は問題ではなく、ここでは無関係です。privateBase

于 2016-01-23T15:14:00.047 に答える