use*_*020 2 c++ namespaces argument-dependent-lookup
如果在调用它的作用域中找不到函数,则会查找其参数的名称空间.我有几个问题.
如果在不同的命名空间中有多个参数,首先会查找哪个命名空间?它是第一个参数的命名空间吗?
f(A::T t, B:U u); // Is namespace A looked up first?
Run Code Online (Sandbox Code Playgroud)模板类更复杂,比如
f(A::T<B::U> t); // Namespace A or B is looked up first?
Run Code Online (Sandbox Code Playgroud)实际上,ADL的命名空间之间没有顺序.搜索所有相关的命名空间,并且因此找到的所有函数形成用于重载解析的候选集合.
另外请注意,不像你的问题说什么,ADL是即使在功能执行时通过调用范围不合格查找发现.然后使用非限定查找和ADL的并集来查找最佳过载.
只有在调用范围内的非限定查找找到类成员,非函数或块范围非using声明时,才会抑制ADL .
相关规则在C++ 14 3.4.2 [basic.lookup.argdep]中.引用N4140,大胆强调我的:
3令X为非限定查找(3.4.1)生成的查找集,并让Y为由参数相关查找生成的查找集(定义如下).如果X包含
- 集体成员的声明,或
- 块范围函数声明,它不是using声明,或
- 既不是函数也不是函数模板的声明
那么Y是空的.否则Y是在与参数类型相关联的名称空间中找到的声明集,如下所述.通过查找名称找到的声明集是 X和Y的并集.