C++ 是不是;“朋友”;将类扩展到该类中声明的类?

C++ 是不是;“朋友”;将类扩展到该类中声明的类?,c++,friend,C++,Friend,我有下面的代码,其中类A声明类B为friend。在B类中声明的C类是否应该能够查看A类的私有声明/成员 它使用CL版本16(Visual Studio 2010)编译时没有错误,但gcc g++版本4.1.1给出了错误“typedef int A::T在此上下文中是私有的” 同样的行为也发生在typedefs函数调用中(这就是我发现差异的原因) 我看了一会儿,但找不到合适的搜索词。我还没有通读标准。以前有没有关于这个问题的问题,或者在C++常见问题中提到过?哪种行为符合标准,如果有?来自标准文档

我有下面的代码,其中类A声明类B为friend。在B类中声明的C类是否应该能够查看A类的私有声明/成员

它使用CL版本16(Visual Studio 2010)编译时没有错误,但gcc g++版本4.1.1给出了错误“typedef int A::T在此上下文中是私有的”

同样的行为也发生在typedefs函数调用中(这就是我发现差异的原因)


我看了一会儿,但找不到合适的搜索词。我还没有通读标准。以前有没有关于这个问题的问题,或者在C++常见问题中提到过?哪种行为符合标准,如果有?

来自标准文档,
$11.4.2

将一个类声明为好友意味着该类的私有成员和受保护成员的名称将授予好友 可以在befriended类的基说明符和成员声明中访问

标准文档中的一个示例

class A {
class B { };
friend class X;
};
struct X : A::B { // OK: A::B accessible to friend
    A::B mx; // OK: A::B accessible to member of friend
    class Y {
        A::B my; // OK: A::B accessible to nested member of friend
    };
};
因此,它应该可以正常工作。

似乎有

根据C++03[CD1之前的版本],您的代码不应该编译,因为措辞和示例表明类的私有成员(授予友谊)不能在friend类的嵌套成员中访问

C++11给出了与C++03中相同的示例。对该示例所做的唯一更改是,friend类的嵌套成员(类)能够访问授予友谊的类的私有成员

将类声明为好友意味着可以在befriended类的基说明符和成员声明中访问授予友谊的类中的私有成员和受保护成员的名称

再看看普拉松提到的问题#45。。。这种行为在C++0x中会发生变化。旧的行为是(11.7
[class.access.nest]
第1段):

嵌套类的成员对封闭类的成员以及授予封闭类友谊的类或函数没有特殊访问权


这清楚地表明,根据C++03规则,GCC4.1是正确的。gcc 4.5和MSVC2010正在使用C++0x规则。

请参阅。我觉得这段代码的格式很好。在GCC4.5.1和comeau在线上编译。我想知道为什么我的gcc是过时的,它应该是新安装的。哦,好吧。非常感谢。友谊是复杂的…谢谢你!在我看来是权威性的。也看看答案。
class A {
class B { };
friend class X;
};
struct X : A::B { // OK: A::B accessible to friend
    A::B mx; // OK: A::B accessible to member of friend
    class Y {
        A::B my; // OK: A::B accessible to nested member of friend
    };
};