根据ISO 2003,内部类访问外部的私有成员 > ISOC++ 2003
§11.8嵌套类[类.访问.嵌套] 嵌套类的成员对 封闭类,也不适用于已授予 对封闭班级的友谊;通行规则(第11条) 必须服从。封闭类的成员没有特殊的 访问嵌套类的成员;通常的访问规则(第条) 11) 必须服从 [示例:根据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
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的情况下尝试。