Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 827
Armen Tsirunyan Avatar asked Sep 21 '25 04:09

Armen Tsirunyan


1 Answers

[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
    };
};
like image 162
SingerOfTheFall Avatar answered Sep 22 '25 18:09

SingerOfTheFall



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!