Это не ADL.В обоих ваших примерах foo
найдено с помощью обычного поиска.Пример использования ADL может быть следующим:
namespace ns {
class A { };
void f(A) { };
}
int main() {
f(A());
}
Здесь f
не найден при обычном поиске, но он найден через поиск, зависящий от аргумента (потому что он находится в пространстве имен ns
рядом с A
).В любом случае ...
Избегайте ADL, где это возможно.
ADL полезен в определенных конкретных сценариях, например, для перегрузки оператора и для концепции смены.Тем не менее, его следует использовать с осторожностью, поскольку это приводит к странному, неожиданному поведению во многих других случаях.