$ 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)
令人困惑的是,从'A :: f1'调用'f'是可以理解的.然而,当一个朋友处于好友阶层的"词汇"范围时,为什么从'A :: f2'调用'f'是不正确的?"词汇"范围意味着什么?
在同一类型中,为什么在"f"中使用'MYINT'可以?不应该是'A :: MYINT'吗?
如果我将'A*'类型的参数添加到'f',那么'f1'和'f2'都能够因为ADL而找到'f'.这是可以理解的.
您仅引用了 §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()遵循与该类的静态成员函数相同的名称绑定规则,并且对封闭类的成员没有特殊的访问权限。