嵌套类的嵌套类的访问权限

时间:2018-03-31 08:05:49

标签: c++ language-lawyer inner-classes

在C ++中,嵌套类具有对封闭类的所有成员的访问权限。这是否也适用于嵌套类的嵌套类?

此代码

#include <iostream>

class A
{
public:
    class B
    {
    public:
        B() { std::cout << A::x << std::endl; }

        class C
        {
        public:
            C() { std::cout << A::x << std::endl; }

        };

    };

private:
    static const int x { 0 };

};

int main()
{
    A::B b;

    A::B::C c;
}

在g ++ 7.2上编译时没有警告。但是,我不清楚这是否符合标准。标准草案(N4727 14.7)说:

  

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

但是,在上面的示例中,C不是A的成员,它是成员的成员。这里的标准模棱两可吗? g ++行为是否可移植?

2 个答案:

答案 0 :(得分:5)

  

但是,在上面的示例中,C不是A的成员,它是成员的成员。

是的,这是明确定义的行为;访问权限从B转移。

根据标准[class.access]/2

  

类的成员也可以访问该类可以访问的所有名称。

[class.mem]/1

  

类的成员是数据成员,成员函数,嵌套类型,枚举数以及成员模板和特化。

CB的嵌套类,它也是B的成员,然后C可以访问B可能的名称访问权限,包括A::x。出于同样的原因,C::CC的成员,它可以访问C可以访问的名称,因此访问A::x中的C::C很好。

答案 1 :(得分:2)

行为定义明确,符合标准措辞。你遗漏的是[class.access]p2的相关措辞,它强化了你已经引用过的内容:

  

类的成员也可以访问该类具有的所有名称   访问。成员函数的本地类可以访问与该函数相同的名称   成员函数本身可以访问。

这意味着可访问性是可传递的。如果C可以访问与B相同的实体,则表示C可以访问A中的实体,因为B可以访问这些实体

class A {
  class B {
    class C {
      C() { A::x; /* well-defined */ }
    };
  };

  static int x;
};