"朋友结构A"之间有什么区别?和"朋友A" 句法?

Wal*_*ter 9 c++ friend c++11

做的有什么区别:

struct A;
struct B { friend struct A; };
Run Code Online (Sandbox Code Playgroud)

struct A;
struct B { friend A; };
Run Code Online (Sandbox Code Playgroud)

struct在第二部分中省略了什么意思?

Ant*_*vin 15

不同的是,如果你写friend A;,A必须是一个已知的类型名称,即它必须在之前声明.

如果你写friend struct A;,这本身就是一个声明A,因此不需要事先声明:

struct B { friend struct A; }; // OK
Run Code Online (Sandbox Code Playgroud)

但有几个微妙之处.例如,在friend class/struct AA的最内层封闭命名空间中声明类B(感谢Captain 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
    };
}
Run Code Online (Sandbox Code Playgroud)

还有其他几种情况,你只能写friend A:

  1. A 是typedef-name:

    class A;
    typedef A A_Alias;
    
    struct B {
        // friend class A_Alias;  - ill-formed
        friend A_Alias;
    };
    
    Run Code Online (Sandbox Code Playgroud)
  2. A 是一个模板参数:

    template<typename A>
    struct B { 
        // friend class A;  - ill-formed
        friend A;
    };
    
    Run Code Online (Sandbox Code Playgroud)