c++language-lawyerfriendmember-access

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


The following code compiles on MSVC:

#include <iostream>

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

So it seems that if Outer is a friend of Bob, so is Inner, automatically. I am reading the Friends chapter of the standard and am unable to find a clause that would confirm or refute this.

Is this legal, and if so, what's the chapter and verse?


Solution

  • [class.access.nest]/1 states that

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

    So I believe yes, this is standard behavior.

    Let's say that Outer has a member function foo(). That function, of course, will have access to Bob's members. To my understanding, the part that I quoted implies that any nested class inside Outer would have the same access rights as foo(), thus having the ability to access Bob's members.

    It is also worth noting that the standard contains the following example ([class.friend]/2), note the usage of A::B in Y:

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