几天前,我问了一个关于类内定义的友元函数范围的问题(类中定义的朋友函数属于哪个范围?),我知道该函数属于封闭命名空间,但在类外部显式声明之前不会被搜索(ADL是一个例外).
今天我在C++标准(第11.3节)中找到了一些相关的陈述:
当且仅当该类是非本地类(9.8),函数名称是非限定的,并且该函数具有命名空间范围时,才能在类的友元声明中定义函数.[例如:
Run Code Online (Sandbox Code Playgroud)class M { friend void f() { } // definition of global f, a friend of M, // not the definition of a member function }; —end example ]这种功能是含蓄的
inline.在类中定义的友元函数位于定义它的类的(词法)范围内.在类外定义的友元函数不是(3.4.1).
我们可以看到这里有两个与范围相关的语句:"具有命名空间范围"和"位于定义它的类的(词法)范围内".我在这里很困惑.如果前者与我之前的问题(一个类内定义的朋友函数属于哪个范围?)有关,那么后者代表什么?
“命名空间作用域函数”是属于命名空间成员的函数(即,此处的“作用域”表示该函数的“主作用域”)。
后面的语句链接到3.4.1,不得不说
在授予友谊的类中内联定义的友元函数 (11.3) 的定义中使用的名称的名称查找应按照成员函数定义中的查找描述进行。