If Outer is my friend, is Outer :: Inner also?
The following code compiles to 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 Bob's friend, then Inner is automatically. I am reading the Friends chapter of the standard and cannot find a proposal that confirms or refutes this.
Is this legal, and if so, what are the chapter and verse?
source to share
[class.access.nest] / 1 indicates that
The nested class is a member and as such has the same access rights as any other member
So, I believe this is the standard behavior.
Let's say it Outer
has a member function foo()
. This function will of course have member access Bob
. As I understand it, the part I quoted implies that any nested class inside Outer
will have the same access rights as it does foo()
, thus having the ability to access members Bob
.
It's also worth noting that the standard contains the following example ( [class.friend] / 2 ), note the usage 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
};
};
source to share