2017-02-22 17 views
2

関数が呼び出されたスコープ内に関数が見つからない場合は、引数の名前空間を参照します。いくつかの質問を聞きたいんです。関数ルックアップと名前空間

  1. 異なる名前空間に複数の引数がある場合、どの名前空間が最初に参照されますか?それは最初の引数の名前空間ですか?

    f(A::T<B::U> t); // Namespace A or B is looked up first? 
    

答えて

5

のようなテンプレートクラスの

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は、後述の 引数型に関連付けられた名前空間にある宣言のセットです。 名前の検索によって見つかった宣言の集合は、 XYの和集合です。