以下のウィキペディアの記事では、引用が言及されています:
ADL は、非修飾名の通常の検索で一致するクラス メンバー関数が見つからない場合にのみ発生します。この場合、通常のルックアップでは考慮されない他の名前空間 が検索される可能性があります。検索される名前空間のセットは、関数の引数の型によって異なります。
したがって、以下のプログラムが正常にコンパイルされることを期待していましたが、そうではありません。
namespace N1 {
class A {};
void foo (A *p) {}
}
namespace N2 {
void foo (N1::A &p) {}
}
int main () {
N1::A xa;
foo(&xa); // ok
foo(xa); // error: cannot convert ‘N1::A’ to ‘N1::A*’ for argument ‘1’ to ‘void N1::foo(N1::A*)’
}
SO でいくつかの質問を検索しましたが、要件や状況を簡単な言葉で表したものを見つけることができませんでした。
もう少し詳細な回答は、私と将来の訪問者にとって本当に役に立ちます。