を機能次のことを考えてみます。最初のケースで引数依存ルックアップが
namespace N {
struct A { };
struct B {
B() { }
B(A const&) { }
friend void f(B const&) { }
};
}
int main() {
f(N::B{}); // ok
f(N::A{}); // error
}
、ケースが成功する - 私たちはN::B
の関連する名前空間を考慮し、N::f(B const&)
を見つけます。すばらしいです。
2番目のケースは失敗します。どうして? [namespace.memdef]によると:
非ローカルクラスで
friend
宣言が最初のクラス、関数、クラステンプレートまたは関数テンプレートを宣言する場合友人は最も内側の名前空間のメンバーです。 [...]フレンド関数またはファンクションテンプレート が呼び出された場合、その名前は、ファンクション引数の型(3.4.2)に関連するネームスペースおよびクラスからファンクションを考慮する名前ルックアップによって検出されます。
N::A
の関連する名前空間はf
がメンバーである、N
あるので、なぜそれが検索によって発見されていませんか?