朋友混淆

Chu*_*dad 6 c++ friend

$ 11.4/5 - "[...]类中定义的友元函数位于定义它的类的(词法)范围内[...]

这句话是什么意思?

struct A{
   typedef int MYINT;
   void f2(){f();}                    // Error, 'f' is undefined
   friend void f(){MYINT mi = 0;}     // Why does this work, shouldn' it be A::MYINT?
   void f1(){f();}                    // Error, 'f' is undefined
};

int main(){}
Run Code Online (Sandbox Code Playgroud)
  1. 令人困惑的是,从'A :: f1'调用'f'是可以理解的.然而,当一个朋友处于好友阶层的"词汇"范围时,为什么从'A :: f2'调用'f'是不正确的?"词汇"范围意味着什么?

  2. 在同一类型中,为什么在"f"中使用'MYINT'可以?不应该是'A :: MYINT'吗?

如果我将'A*'类型的参数添加到'f',那么'f1'和'f2'都能够因为ADL而找到'f'.这是可以理解的.

Kir*_*sky 1

您仅引用了 §11.4/5 的部分内容。根据它,f()应该首先在类外声明(函数应该具有命名空间范围)。尝试这个:

void f(); // declare it first
struct A{
   typedef int MYINT;
   void f2(){f();}                    
   friend void f(){MYINT mi = 0;}     // definition of global f, a friend of A
   void f1(){f();}                    
};
Run Code Online (Sandbox Code Playgroud)

至于第二个问题,没关系,因为你引用了§11.4/5的部分内容。f()遵循与该类的静态成员函数相同的名称绑定规则,并且对封闭类的成员没有特殊的访问权限。