C++ 函数查找和名称空间

C++ 函数查找和名称空间,c++,namespaces,argument-dependent-lookup,C++,Namespaces,Argument Dependent Lookup,如果在调用函数的作用域中找不到函数,则随后将在其参数的名称空间中查找。我有几个问题 如果在不同的名称空间中有多个参数,将首先查找哪个名称空间?它是第一个参数的名称空间吗 f(A::T t, B:U u); // Is namespace A looked up first? 模板类更复杂,如 f(A::T<B::U> t); // Namespace A or B is looked up first? f(A::T);//首先查找名称空间A或B? 实际上,ADL的名称空间之

如果在调用函数的作用域中找不到函数,则随后将在其参数的名称空间中查找。我有几个问题

  • 如果在不同的名称空间中有多个参数,将首先查找哪个名称空间?它是第一个参数的名称空间吗

    f(A::T t, B:U u); // Is namespace A looked up first?
    
  • 模板类更复杂,如

    f(A::T<B::U> t); // Namespace A or B is looked up first?
    
    f(A::T);//首先查找名称空间A或B?
    

  • 实际上,ADL的名称空间之间没有顺序。所有相关的名称空间都会被搜索,因此找到的所有函数构成重载解析的候选函数集

    还要注意的是,与您在问题中所说的不同,即使通过调用范围中的非限定查找找到函数,也会执行ADL。然后使用非限定查找和ADL的结合来查找最佳重载

    只有在调用作用域的非限定查找使用声明找到类成员、非函数或块作用域非时,ADL才会被抑制

    相关规则见C++14 3.4.2[basic.lookup.argdep]。引用N4140,粗体强调:

    3设X为不合格查找(3.4.1)产生的查找集,Y为不合格查找(3.4.1)产生的查找集 依赖于参数的查找(定义如下)。如果X包含

    • 类成员的声明,或
    • 不是using声明的块作用域函数声明,或
    • 既不是函数也不是函数模板的声明
    那么Y是空的。否则,Y是在与 参数类型如下所述通过查找名称找到的声明集是 X和Y.