"朋友结构A之间的区别是什么;"和#34;朋友A;"句法?

时间:2014-10-23 22:12:48

标签: c++ c++11 friend

做什么之间有什么区别:

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

struct A;
struct B { friend A; };

在第二部分遗漏struct是什么意思?

1 个答案:

答案 0 :(得分:15)

不同之处在于,如果您编写friend A;A必须是已知的类型名称,那就必须在之前声明。

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

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

但有几个细微之处。例如,friend class/struct A在类A的最内层封闭命名空间中声明了类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
    };
}

还有其他几种情况,只能写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;
    };