嵌套类嵌套类的访问权限

Access rights of a nested class of a nested class

本文关键字:嵌套 权限 访问权 访问      更新时间:2023-10-16

在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 行为可移植?

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

是的,这是定义明确的行为;访问权利从B传输。

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

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

和[class.mem]/1,

类的成员是数据成员,成员功能,嵌套类型,枚举者和成员模板及其专业。

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

该行为定义明确,并与标准措辞结合。您缺少的是[class.access]p2的相关措辞,它增强了您已经引用的内容:

班级的成员也可以访问班级拥有的所有名称 使用权。成员函数的本地类可以访问与 成员功能本身可以访问。

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

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