ADL全称是Argument Dependent Lookup,是C++编译器解析unqualified name的规则。
unqualified name,指的是name没有被命名空间前缀修饰,即不是 NS::name 的形式。
当C++编译器解析unqualified name时,有一条比较不明显的规则:当函数调用的名称是unqualified,会首先检查函数名在参数类型所在的命名空间中是否存在定义,如果有,则将函数调用解析为该定义。
namespace MyNamespace
{
class MyClass {};
void doSomething(MyClass) {}
}
MyNamespace::MyClass obj; // global object
int main()
{
doSomething(obj); // Works Fine - MyNamespace::doSomething() is called.
}