为什么不能在类中引用声明的朋友类?

Kan*_* Li 27 c++ friend

以下代码无法编译:

struct X {
  friend class Y;
  Y* ptr;
};
Run Code Online (Sandbox Code Playgroud)

cppreference描述的情况为

...如果尚未声明友元声明中使用的类的名称,则会在现场进行前向声明.

如果"spot"表示声明朋友关系的位置,则声明该成员应该没问题Y* ptr.为什么不编译?标准中的哪个地方禁止这个?

das*_*ght 29

这是网站上的一个错误.它与标准相矛盾,后者表示友谊宣言不能代替前瞻性声明:

7.3.1.2.3在名称空间中首先声明的每个名称都是该名称空间的成员.如果非本地类中的友元声明首先声明了类,函数,类模板或函数模板,则该友元是最内层封闭命名空间的成员.友元声明本身不会使名称对非限定查找或限定查找可见.

关于名称对于非限定或限定查找不可见的部分实质上意味着该名称的行为不像前向声明.

  • 我怀疑所引用的句子试图说的是你不需要一个前瞻声明来宣布一个朋友,它是为了这个目的隐含地向前宣布的. (4认同)