功能查找和名称空间

function lookup and namespaces

本文关键字:空间 查找 功能      更新时间:2023-10-16

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

  1. 如果不同的名称空间中有几个参数,则首先要查找哪个名称空间?是第一个参数的名称空间吗?

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

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

实际上,ADL名称空间之间没有顺序。搜索所有相关的名称空间,因此发现所有功能构成了超负荷分辨率的候选人集。

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

ADL仅在调用范围的无限制查找找到类成员,非功能或块scope non- using声明时才能抑制ADL。

相关规则在C 14 3.4.2 [BASIC.LOKUP.ARGDEP]中。引用N4140,大胆的重点:

3令 x 是由不合格的查找(3.4.1)产生的查找集,让 y 是由 参数依赖性查找(定义如下)。如果 x 包含

  • 班级成员的声明或
  • 一个不是使用模式的块函数声明,或
  • 既不是函数模板的声明

然后 y 是空的。否则, y 是在与该名称空间中发现的一组声明 参数类型如下所述。名称查找的声明集是 x y