Если класс Outer — мой друг, класс Outer :: Inner тоже?

Следующий код компилируется в MSVC:

#include <iostream>

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

Так что кажется, что если Аутер — друг Боба, то и Внутренний автоматически. Я читаю главу «Друзья» стандарта и не могу найти пункт, который подтвердил бы или опровергнул это.

Законно ли это, и если да, то какова глава и стих?

3

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]