Следующий код компилируется в MSVC:
#include <iostream>
class Bob
{
int a;
friend class Outer;
};
class Outer
{
class Inner
{
void f(Bob obj)
{
std::cout << obj.a; //OK
}
};
};
Так что кажется, что если Аутер — друг Боба, то и Внутренний автоматически. Я читаю главу «Друзья» стандарта и не могу найти пункт, который подтвердил бы или опровергнул это.
Законно ли это, и если да, то какова глава и стих?
[Class.access.nest] / 1 говорится, что
Вложенный класс является членом и, следовательно, имеет те же права доступа, что и любой другой член.
Поэтому я считаю, что да, это стандартное поведение.
Скажем так Outer
имеет функцию-член foo()
, Эта функция, конечно же, будет иметь доступ к Bob
участники. Насколько я понимаю, часть, которую я привел, подразумевает, что любой вложенный класс внутри Outer
будет иметь те же права доступа, что и foo()
, таким образом, имея возможность доступа Bob
участники.
Также стоит отметить, что стандарт содержит следующий пример ([Class.friend] / 2), обратите внимание на использование A::B
в 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
};
};
Других решений пока нет …