Уловка для путаницы заключается в создании сценария, в котором аргументы функции являются взаимозаменяемыми или конвертируемыми, и ADL может выбрать что-то, что может не соответствовать вашим ожиданиям.Я не уверен, что это впечатляет или просто ожидается :
namespace a {
struct A {};
void f( A* ) { std::cout << "a::f" << std::endl; }
}
namespace b {
struct B : ::a::A {};
void f( B* ) { std::cout << "b::f" << std::endl; }
}
void test() {
f( new b::B ); // b::f
a::A* p = new b::B;
f( p ); // a::f
}
Типы совпадают, но ADL проверит статический тип аргумента идобавить это пространство имен в поиск.Это, в свою очередь, означает, что точный статический тип может сделать различные функции видимыми для компилятора.Вещи могут быть более запутанными, когда существует более одного аргумента, к которому может применяться ADL или разрешение перегрузки.