如果class外是我的朋友,class Outer::Inner也是吗?

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

以下代码可在 MSVC 上编译:

#include <iostream>

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

所以看起来如果 Outer 是 Bob 的朋友,那么 Inner 也是自动的。我正在阅读标准的 Friends 章节,但找不到可以证实或反驳这一点的条款。

这是合法的吗?如果是的话,章节是什么?

[class.access.nest]/1 指出

A nested class is a member and as such has the same access rights as any other member

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

假设 Outer 有一个成员函数 foo()。当然,该函数将有权访问 Bob 的成员。据我了解,我引用的部分暗示 Outer 中的任何嵌套 class 都将具有与 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
    };
};