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