函数查找和命名空间

use*_*020 2 c++ namespaces argument-dependent-lookup

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

  1. 如果在不同的命名空间中有多个参数,首先会查找哪个命名空间?它是第一个参数的命名空间吗?

    f(A::T t, B:U u); // Is namespace A looked up first?
    
    Run Code Online (Sandbox Code Playgroud)
  2. 模板类更复杂,比如

    f(A::T<B::U> t); // Namespace A or B is looked up first?
    
    Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

实际上,ADL的命名空间之间没有顺序.搜索所有相关的命名空间,并且因此找到的所有函数形成用于重载解析的候选集合.

另外请注意,不像你的问题说什么,ADL是即使在功能执行通过调用范围不合格查找发现.然后使用非限定查找和ADL的并集来查找最佳过载.

只有在调用范围内的非限定查找找到类成员,非函数或块范围非using声明时,才会抑制ADL .

相关规则在C++ 14 3.4.2 [basic.lookup.argdep]中.引用N4140,大胆强调我的:

3令X为非限定查找(3.4.1)生成的查找集,并让Y为由参数相关查找生成的查找集(定义如下).如果X包含

  • 集体成员的声明,或
  • 块范围函数声明,它不是using声明,或
  • 既不是函数也不是函数模板的声明

那么Y是空的.否则Y是在与参数类型相关联的名称空间中找到的声明集,如下所述.通过查找名称找到的声明集是 XY的并集.