(lookup)する仕組みのことである。lookupなどと呼ばれる。Koenigが提案したことにちなむ。外部リンク概要[編集]実引数依存の名前探索では、通常の名前探索では考慮されない他の名前空間も探索される可能性がある。探索される名前空間は実引数に依存する。・間接的に基底クラスを持つクラスAに対しては、その直接・間接的な基底クラスが「Aに関連するクラス」となる。Aが含まれる名前空間とAに関連するクラスが含まれる名前空間は、「Aに関連する名前空間」となる。A型のオブジェクトが関数呼出の際に実引数として用いられると、関連する名前空間からその関数が探索される。探索によって見つかった宣言の集合は通常の名前探索で見付けた名前と関連する名前空間から見付けた名前とをまとめたものになる。その後この見付かった宣言の集合の中から多重定義の解決が行われる。通常の名前探索でクラスのメンバ関数が探索された場合、実引数依存の名前探索は行われない。//NS::f(a);と呼び出しているわけではないのに、NS::fが呼ばれる。次のプログラムは実引数依存の名前探索が無ければコンパイルできない。std::string&)と宣言された関数は、実引数依存の探索によって見付かる(この関数はstd名前空間の中に存在することに注目)。<<の引数として用いられているため、std::などといった完全な修飾が必要であることに注意。インタフェース[編集]C++ユーザからは、ADLで見つかる名前はクラスのインタフェースの一部と扱われる。(STL)では、一部のアルゴリズム関数がswap関数を修飾無しで呼ぶが、ADLで何も見つからなければ、結果的に同じ名前空間stdのswap関数が呼ばれる。ADLで見つかったときはそちらが呼ばれる。Foo&)が使用されるという具合である。この挙動はC++03では規定されておらず、必ずしもそうなるとは限らない。C++0xで規定される見込みである。問題点[編集]ADLは自由関数(名前空間上に存在するクラスのメンバでない関数)もクラスのインタフェースとして扱う。名前空間に制限をもたらし、必要がなければ(名前空間などの指定で)完全に修飾された名前を用いる必要があることを意味する。逆の例として、標準C++ライブラリは2つの値の交換にstd::swapを修飾なしで呼ぶことが挙げられる。別の案として、std::swapをユーザに多重定義させるという方法がある。次のコードは挙動が異なる。b);ただし、aとbはN::Aという型とする。N::A&)が存在した場合、後者ではそれ呼ばれるが、前者では呼ばれない。N::A&)が呼ばれるが、後者ではどちらにするか曖昧になる(名前の探索に失敗しコンパイルエラーになる)。std::swapを特殊化するという方法もあるが、特殊化しようとする型がテンプレートの場合に対応できない(自由関数で部分特殊化はできない)ために完璧ではない[1]。std名前空間での多重定義は現在認められていない(特殊化は認められている)。一般にADLに過度に依存すると意味の問題が起こる。あるライブラリL1がL1::foo(T)が呼び出される前提で未修飾のfoo(T)という呼出を行っているとする。別のライブラリL2も同様にfoo(T)の呼出を行っている。2つのライブラリを同時に使うと、L1::foo(T)が呼ばれなければならない場面でL2::foo(T)が呼ばれるなど互いに意図するとおりにならない可能性が生じる。foo(x);のように書く)。2009年2月1日閲覧。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。開発者Cookieに関する声明モバイルビュ。