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

Rob*_*own 8 c++ inner-classes language-lawyer

在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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

son*_*yao 5

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

是的,这是明确的行为; 访问权转移B.

根据标准[class.access]/2,

类的成员还可以访问该类可以访问的所有名称.

[class.mem]/1,

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

C是一个嵌套类B,它也是其成员B,然后C可以访问可以访问的名称B,包括A::x.出于同样的原因,C::C是的成员C,它可以访问哪些名称C可以访问到,所以访问A::xC::C罚款.