http://en.cppreference.com/w/cpp/language/adlで説明このサンプル考慮:引数依存ルックVS C++の通常のルックアップ
namespace A {
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B {
void f(int i) {
f(i); // calls B::f (endless recursion)
}
void g(A::X x) {
g(x); // Error: ambiguous between B::g (ordinary lookup)
// and A::g (argument-dependent lookup)
}
void h(A::Y y) {
h(y); // calls B::h (endless recursion): ADL examines the A namespace
// but finds no A::h, so only B::h from ordinary lookup is used
}
}
を
「ルック場合ADLルールが考慮されていないので、曖昧さが表示されますなぜ私が疑問に思って通常の非修飾ルックアップによって生成されるセットには、以下のいずれかが含まれます。ここ
その本体またはの一部としてのいずれかで、関数の定義に使用される名前のルール
からhttp://en.cppreference.com/w/cpp/language/unqualified_lookupおかげで説明したように修飾されていないルックアップによってB :: Gを見出すことができます関数がユーザ宣言またはグローバル名前空間のメンバである場合、名前が使用されるブロックが名前の使用前に検索され、そのブロックの開始前に囲まれているブロックが検索されます。関数本体であるブロックに到達します。次に、関数が宣言されている名前空間が考慮さADLのルールがあるなぜ、私の質問があるなどの名前を使用する関数の定義(必ずしも宣言)、そして囲む名前空間、
まで検索されますこの場合?
理由を考慮しない理由を詳しく説明できますか? – cpplearner
最初に、通常の非修飾ルックアップによって生成されたルックアップセットに次のいずれかが含まれている場合、引数依存ルックアップは考慮されません。 – FlashMcQueen
1)クラスメンバーの宣言 2)ブロックスコープでの関数の宣言使用している宣言) 3)関数または関数テンプレートではない宣言(たとえば、関数オブジェクトや、名前が参照されている関数の名前と矛盾している別の変数) – FlashMcQueen