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 objectint main(){doSomething(obj); // Works Fine - MyNamespace::doSomething() is called.}
