根据ISO 2003,内部类访问外部的私有成员 > ISOC++ 2003

根据ISO 2003,内部类访问外部的私有成员 > ISOC++ 2003 ,c++,language-lawyer,nested-class,c++03,C++,Language Lawyer,Nested Class,C++03,§11.8嵌套类[类.访问.嵌套] 嵌套类的成员对 封闭类,也不适用于已授予 对封闭班级的友谊;通行规则(第11条) 必须服从。封闭类的成员没有特殊的 访问嵌套类的成员;通常的访问规则(第条) 11) 必须服从 [示例: class E { int x; class B { }; class I { B b; // error: E::B is private ERROR 1 int y; void f(E* p, in

§11.8嵌套类[类.访问.嵌套]

嵌套类的成员对 封闭类,也不适用于已授予 对封闭班级的友谊;通行规则(第11条) 必须服从。封闭类的成员没有特殊的 访问嵌套类的成员;通常的访问规则(第条) 11) 必须服从

[示例:

class E {
    int x;

    class B { };

    class I {
        B b; // error: E::B is private ERROR 1
        int y;
        void f(E* p, int i)
        {
            p->x = i; // error: E::x is private ERROR 2
        }
    };

    int g(I* p)
    {
        //return p->y; // error: I::y is private ERROR 3
    }
};

int main()
{}
-[结束示例]

因此,我认为这是错误的,因为他们成功地编译了这段代码

还是我理解错了?

标准说的是“没有特殊访问权限”,而不是“完全没有访问权限”。嵌套类与任何其他成员是外部类的同一成员

C++03标准中没有明确说明,但C++11明确包含:

11.7嵌套类[class.access.nest]

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


自2003年以来,这种行为发生了变化。工作草案N4926(C++17)中的相关条款现为:

§11.7嵌套类[类.访问.嵌套]

嵌套类是成员,因此具有与任何其他成员相同的访问权限。成员 封闭类对嵌套类的成员没有特殊访问权限;通行规则(第11条) 必须服从

因此,访问是一种方式:嵌套类成员可以访问封闭类成员,但反之亦然

例如:

class Enclosing
{
  int n;
  class Nested
  {
    int n;
    int f (Enclosing& E)
    {
      return E.n; // OK
    }
  } ;
  int f (Nested& N)
  {
    return N.n; // Error: Nested::n is private
  }
} ;

与的相关/副本相关,反之亦然,它们在访问权限上彼此平等。@VladislavYaroslavlev:在C++17中,它们不是。到底是什么禁止访问?规则上说:“没有特殊权限”,而不是“没有权限”。任何私有成员都可以看到任何其他私有成员。该条款(11.7)已经在C++11中,而不是在C++17中。@VladislavYaroslavlev:禁止它的是短语“应遵守通常的访问规则”。我在回答中添加了一个示例。在启用C++14或C++17的情况下尝试。