https://stackoverflow.com/questions/8111677/what-is-argument-dependent-lookup-aka-adl-or-koenig-lookup

    ADL全称是Argument Dependent Lookup,是C++编译器解析unqualified name的规则。
    unqualified name,指的是name没有被命名空间前缀修饰,即不是 NS::name 的形式。

    当C++编译器解析unqualified name时,有一条比较不明显的规则:当函数调用的名称是unqualified,会首先检查函数名在参数类型所在的命名空间中是否存在定义,如果有,则将函数调用解析为该定义。

    1. namespace MyNamespace
    2. {
    3. class MyClass {};
    4. void doSomething(MyClass) {}
    5. }
    6. MyNamespace::MyClass obj; // global object
    7. int main()
    8. {
    9. doSomething(obj); // Works Fine - MyNamespace::doSomething() is called.
    10. }