関数が呼び出されたスコープ内に関数が見つからない場合は、引数の名前空間を参照します。いくつかの質問を聞きたいんです。関数ルックアップと名前空間
異なる名前空間に複数の引数がある場合、どの名前空間が最初に参照されますか?それは最初の引数の名前空間ですか?
f(A::T<B::U> t); // Namespace A or B is looked up first?
関数が呼び出されたスコープ内に関数が見つからない場合は、引数の名前空間を参照します。いくつかの質問を聞きたいんです。関数ルックアップと名前空間
異なる名前空間に複数の引数がある場合、どの名前空間が最初に参照されますか?それは最初の引数の名前空間ですか?
f(A::T<B::U> t); // Namespace A or B is looked up first?
のようなテンプレートクラスの
f(A::T t, B:U u); // Is namespace A looked up first?
より複雑で、実際には、ADLのための名前空間の間には順序がありません。すべての関連するネームスペースが検索され、こうして見つけられたすべての関数が、過負荷解決の候補のセットを形成する。
また、あなたが言うこととは異なり、関数がである場合でも、呼び出しスコープで非修飾ルックアップによってADLが実行されます。次に、非修飾ルックアップとADLの結合を使用して、最適なオーバーロードを検出します。
呼び出しスコープでの修飾されていない参照が、クラスメンバー、関数以外、またはブロックスコープの非using
宣言を検出した場合のみ、ADLは抑制されます。
関連ルールはC++で提供されています。14 3.4.2 [basic.lookup.argdep]。 N4140、太字の強調鉱山を引用:
3次のように定義される((3.4.1)Xは、非修飾参照によって生成されるルックアップ・セットであるとするとYは 引数依存ルックアップによって生成ルックアップ集合とします)。 はX
- クラスメンバの宣言、又は
- using宣言ないブロックスコープ関数宣言、または
- 関数または関数でもない宣言を含んでいる場合テンプレート
次にが空です。そうでない場合Yは、後述の 引数型に関連付けられた名前空間にある宣言のセットです。 名前の検索によって見つかった宣言の集合は、 XとYの和集合です。