根据 C++ 标准 ISO/IEC 14882:2003(E) 中的 7.3.1.2 命名空间成员定义
在命名空间中首先声明的每个名称都是该命名空间的成员。如果非本地类中的友元声明首先声明了一个类或函数(这意味着类或函数的名称是不合格的),则友元类或函数是最内层封闭命名空间的成员。
// Assume f and g have not yet been defined.
void h(int);
template <class T> void f2(T);
namespace A {
class X {
friend void f(X); // A::f(X) is a friend
class Y {
friend void g(); // A::g is a friend
friend void h(int); // A::h is a friend
// ::h not considered
friend void f2<>(int); // ::f2<>(int) is a friend
};
};
// A::f, A::g and A::h are not visible here
X x;
void g() { f(x); } // definition of A::g
void f(X) { /* ... */} // definition of A::f
void h(int) { /* ... */ } // definition of A::h
// A::f, A::g and A::h are visible here and known to be friends
}
由于void h(int);
首先在全局命名空间中声明,因此它是全局命名空间的成员。为什么要考虑friend void h(int);
而不是考虑朋友声明?class Y
A::h
::h