В чем разница между синтаксисом "friend struct A" и "friend A"?

в чем разница между:

struct A;
struct B { friend struct A; };

и

struct A;
struct B { friend A; };

что значит пропустить struct во второй части?

1 ответов


разница в том, что если вы пишите friend A;, A должно быть известным именем типа, то есть оно должно быть объявлено ранее.

если вы пишите friend struct A;, это само по себе заявление A, поэтому не требуется предварительного объявления:

struct B { friend struct A; }; // OK

есть правда несколько тонкостей. Например, friend class/struct A объявляет класс A в самом внутреннем пространстве имен класса B (спасибо капитан Obvlious):

class A;
namespace N {
    class B {
        friend A;         // ::A is a friend
        friend class A;   // Declares class N::A despite prior declaration of ::A,
                          // so ::A is not a friend if previous line is commented
    };
}

также есть несколько других случаев, когда вы можете написать только friend A:

  1. A является typedef-name:

    class A;
    typedef A A_Alias;
    
    struct B {
        // friend class A_Alias;  - ill-formed
        friend A_Alias;
    };
    
  2. A является параметром шаблона:

    template<typename A>
    struct B { 
        // friend class A;  - ill-formed
        friend A;
    };