Учитывая этот пример, описанный в http://en.cppreference.com/w/cpp/language/adl:
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 не принимаются во внимание, если
«набор поиска, созданный обычным неквалифицированным поиском, содержит любое из следующего».
Здесь B :: g можно найти с помощью неквалифицированного поиска, как описано в http://en.cppreference.com/w/cpp/language/unqualified_lookup благодаря правилу
Для имени, используемого в определении функции, либо в ее теле, либо как часть аргумента по умолчанию, где функция является членом объявленного пользователем или глобального пространства имен, блок, в котором используется имя, ищется перед использованием имя, затем перед началом этого блока ищется охватывающий блок и т. д., пока не будет достигнут блок, который является телом функции. Затем ищется пространство имен, в котором объявлена функция, до определения (не обязательно объявления) функции, использующей имя, затем охватывающих пространств имен и т. Д.
Тогда у меня вопрос: почему в данном случае рассматриваются правила ADL?