功能查找和名称空间
function lookup and namespaces
如果在调用的范围中找不到一个函数,则将在其参数的名称空间中查找。我有几个问题。
-
如果不同的名称空间中有几个参数,则首先要查找哪个名称空间?是第一个参数的名称空间吗?
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?
实际上,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 。
相关文章:
- 在类设计中查找外部命名空间中的重载运算符
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 使用 dlsym 查找命名空间中符号的符号
- C++嵌套的"命名空间""使用"名称查找首选项顺序
- 功能查找和名称空间
- 范围运算符需要查找 std 命名空间而不是提升
- C++奇怪的命名空间查找行为
- C++在具有O(n)空间的数组中查找第一个非重复整数
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- C++如何知道在哪里查找使用 "using namespace ..." 指定的命名空间?
- 对C++中的名称空间和参数相关查找感到困惑
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 模板类继承命名空间的名称查找
- 依赖于参数的名称查找:添加要查找的额外命名空间
- 是否应该延迟类成员访问表达式中依赖类/命名空间名称的名称查找
- 使用O(n)时间和O(1)空间从数组中查找丢失的数字
- 在查找命名空间名称的过程中,可以考虑与命名空间名称不同的其他名称
- 强制名称查找以考虑命名空间范围
- 是否应该延迟类模板定义中由 this-> 限定的类/命名空间名称的名称查找?
- 空间复杂性来查找子树