如果类外是我的朋友,类外::内也是

If class Outer is my friend, is class Outer::Inner too?

本文关键字:类外 我的朋友 如果      更新时间:2023-10-16

以下代码在 MSVC 上编译:

#include <iostream>
class Bob
{        
    int a;
    friend class Outer;
};
class Outer
{      
    class Inner
    {
        void f(Bob obj)
        {
            std::cout << obj.a; //OK
        }
    };
};

因此,如果Outside是Bob的朋友,那么Inner也是,自动。我正在阅读该标准的"朋友"章节,但找不到可以确认或反驳这一点的条款。

这是否合法,如果是,章节和经文是什么?

[class.access.nest]/1 指出

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

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

假设Outer有一个成员函数foo()。当然,该函数将可以访问Bob的成员。据我了解,我引用的部分意味着Outer内的任何嵌套类都将具有与foo()相同的访问权限,因此具有访问Bob成员的能力。

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

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