実引数依存の名前探索

https://ja.wikipedia.org/wiki/%E5%AE%9F%E5%BC%95%E6%95%B0%E4%BE%9D%E5%AD%98%E3%81%AE%E5%90%8D%E5%89%8D%E6%8E%A2%E7%B4%A2

C++のADLは、意図しない挙動を引き起こすことがある。
基本的には必要な機能であるけれど、テンプレートと名前空間が絡んで意図しないLookupが起こるという話。

#include <iostream>

namespace test {
    class bar { };

    // ADL回避版
    namespace foo {
        template <typename T>
    void f(T &) {
            std::cout << "test::f" << std::endl;
    }
    }
    using namespace foo;

    // 意図しないADL
    // template <typename T>
    // void f(T &) {
    //     std::cout << "test::f" << std::endl;
    // }
}

namespace x {
    template <typename T>
    void f(const T &) {
        std::cout << "x::f" << std::endl;
    }

    template <typename T>
    class hoge { };
}

int main() {
    x::hoge<y::bar> h;
    f(h);
}