Если класс 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
        }
    };
};

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

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

1 ответ

Решение

[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
    };
};
Другие вопросы по тегам