C ++中的内部类是否自动成为朋友?

如果我在C ++中定义一个内部类,它是否会自动成为包含它的类的一个朋友? 例如,这是合法的:

class Outer { public: class Inner { public: void mutateOuter(Outer& o); }; private: int value; }; void Outer::Inner::mutateOuter(Outer& o) { o.value ++; // Legal? Or not? } 

我问,因为在我试过的一些编译器(VS2003)这个代码将无法正常工作,但是我至less听说过它在一些编译器上工作。 我在C ++规范中找不到关于这个的相关章节,如果任何人都可以引用某个特定的东西来说明它是合法的或者不合法的,那就太好了。

在自己问了一个或多个相同的问题之后,我想分享(显然)更新的C ++ 11的答案:

引自https://stackoverflow.com/a/14759027/1984137

标准$ 11.7.1

“嵌套类是成员,与其他成员具有相同的访问权限,封闭类的成员对嵌套类的成员没有特殊的访问权限,通常的访问规则应服从”

通常的访问规则指定:

“一个类的成员也可以访问该类访问的所有名称…”

标准中给出了具体的例子:

 class E { int x; class B { }; class I { B b; // OK: E::I can access E::B int y; void f(E* p, int i) { p->x = i; // OK: E::I can access E::x } }; } 

直到C ++ 11(即C ++ 98和C ++ 03)

在C ++ 98和C ++ 03中,默认情况下,嵌套类不能访问封闭类的privateprotected成员。

C ++标准(2003)在$ 11.8 / 1 [class.access.nest]中说,

一个嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有特殊的访问权限给一个封闭类赋予友谊的类或函数; 应遵守通常的访问规则(第11条)。 封闭类的成员对嵌套类的成员没有特殊的访问权限; 应遵守通常的访问规则(第11条)。

标准本身的例子:

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

自C ++ 11

自从C ++ 11以来,上面的限制已经被删除了。 现在嵌套类可以访问封闭类的privateprotected成员:

 class E { int x; class B { }; class I { B b; // ok: even though E::B is private int y; void f(E* p, int i) { p->x = i; // ok: even though E::x is private } }; int g(I* p) { return p->y; // ok: even though I::y is private } }; 

希望有所帮助。

由于提问者似乎已经接受了答案之一,这只是一个补充。
标准似乎已经改变了有关可访问性的规范。

C ++ 98中的§11.8/ 1指出:

嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有对已经给封闭类授予友谊的类或函数。 应遵守通常的访问规则。

N1804中的§11.8/ 1(TR1之后)指出:

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

我认为目前的C ++编译器服从更新的规范。

我的头脑里并没有确切的位置,但是我确实记得阅读规范,发现一个类中的任何私有数据都隐藏在所有其他类(包括嵌套类)中。

基本上,嵌套类定义了一定的范围,而不是访问权限。

这个答案适用于(过时的)C ++ 03规范。 在这个问题上接受的答案是更新的。

那么现在我觉得这个问题很愚蠢,因为我刚刚发现了这个规范的相关部分:§11.8/ 1:

嵌套类的成员对封闭类的成员没有特殊的访问权限,也没有对已经给封闭类授予友谊的类或函数。 应遵守通常的访问规则(第11条)。 封闭类的成员对嵌套类的成员没有特殊的访问权限; 应遵守通常的访问规则(第11条)

(我的重点)

所以看起来不是,内部类没有特殊的访问权限。