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 行不编译似乎很自然。但是,另一方面,变量b具有公共成员nested,我可以Do()从外部调用它的方法Base(如 A 行)。在这种情况下,规范对私有嵌套类(或其成员)的访问的精确规则是什么?标准对此有何规定?

4

2 回答 2

6

根据标准,$11.7/1 嵌套类 [class.access.nest]

嵌套类是成员,因此具有与任何其他成员相同的访问权限。

所以,这很简单。NestedBaseprivateclass 的成员Base,因此Base::NestedBase无法在 中访问main()

b.nested.Do();很好,因为nested并且Do()都是public成员。嵌套类的NestedBase事实无关紧要,在这里无关紧要。privateBase

于 2016-01-23T15:14:00.047 回答
2

类型名称NestedBase是类的私有成员。

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

因此,您不能在声明名称的类之外显式访问它。

但是您可以通过以下方式隐式访问该名称:)

decltype( Base::nested) instance;
于 2016-01-23T15:32:27.113 回答