実引数依存の名前探索
出典: フリー百科事典『ウィキペディア(Wikipedia)』
実引数依存の名前探索 (じつひきすういぞんのなまえたんさく、ADL)とは、C++において関数呼出時に与えられた引数の型に依存して、呼び出す関数を特定(探索、lookup)する仕組みのことである。英語ではKoening lookup、argument dependent lookup (ADL)、argument dependent name lookupなどと呼ばれる。なお、Koening lookupとは、この仕組みをAndrew Koenigが提案したことにちなむ。
実引数依存の名前探索では、通常の名前探索では考慮されない他の名前空間も探索される可能性がある。探索される名前空間は実引数に依存する。たとえば、直接・間接的に基底クラスを持つクラスAに対しては、その直接・間接的な基底クラスが「Aに関連するクラス」となる。Aが含まれる名前空間とAに関連するクラスが含まれる名前空間は、「Aに関連する名前空間」となる。A型のオブジェクトが関数呼出の際に実引数として用いられると、関連する名前空間からその関数が探索される。
もし通常の名前探索でクラスのメンバ関数が探索された場合、実引数依存の名前探索は行われない。ほかにも、探索によって見つかった宣言の集合は通常の名前探索で見つけた名前と関連する名前空間から見つけた名前とをまとめたものになる。
たとえばこのような感じである:
namespace NS { class A {}; void f(A) {} } int main() { NS::A a; f(a); //NS::f(a);と呼び出しているわけではないのに、NS::fが呼ばれる。 }
標準C++ライブラリでは、実引数依存の名前探索を主に演算子多重定義関数に対して用いている。たとえば次のプログラムは実引数依存の名前探索が無ければコンパイルできない。
#include <iostream> #include <string> int main() { std::string msg = "Hello World, where did operator<<() come from?"; std::cout << msg << std::endl; }
std::ostream& std::operator<<(std::ostream&, const std::string&)
と宣言された関数は、実引数依存の探索によって見つかる(この関数はstd名前空間の中に存在することに注目)。ところで、std::endlは関数であるが、operator <<の引数として用いられているため、std::などといった完全な修飾が必要であることに注意。
カテゴリ: C++ | プログラミング言語の構文