C++ 如果班外是我的朋友,班外也是我的朋友吗?

C++ 如果班外是我的朋友,班外也是我的朋友吗?,c++,language-lawyer,friend,member-access,C++,Language Lawyer,Friend,Member Access,以下代码在MSVC上编译: #include <iostream> class Bob { int a; friend class Outer; }; class Outer { class Inner { void f(Bob obj) { std::cout << obj.a; //OK } }; }; #包括 班鲍勃 {

以下代码在MSVC上编译:

#include <iostream>

class Bob
{        
    int a;
    friend class Outer;
};
class Outer
{      
    class Inner
    {
        void f(Bob obj)
        {
            std::cout << obj.a; //OK
        }
    };
};
#包括
班鲍勃
{        
INTA;
朋友班外;
};
类外部
{      
班级内部
{
无效f(Bob obj)
{

std::cout[class.access.nest]/1声明

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

所以我相信是的,这是标准行为

假设
Outer
有一个成员函数
foo()
。该函数当然可以访问
Bob
的成员。据我所知,我引用的部分意味着
Outer
中的任何嵌套类都具有与
foo()相同的访问权限
,从而能够访问Bob的成员

还值得注意的是,该标准包含以下示例([class.friend]/2),请注意
Y
A::B
的用法:

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
    };
};

似乎回答了这个问题。一个类的成员还可以访问该类已访问的所有名称@Jonas的可能副本:这个问题讨论了一个事实,即外部类的私有成员可以从内部访问,这一点我知道。这个问题非常不同,你不认为吗?我不这样认为。它表明sted类可以访问外部类可用的所有名称。这意味着嵌套类可以访问外部类是其朋友的类的成员,因为外部类可以访问这些名称。好的,请为我详细说明一下。我不明白这意味着如果外部是Bob的朋友,那么外部::内部也是如此