Argument-Dependent Lookup是否在正常范围查找之前进行?

时间:2017-10-17 03:47:54

标签: c++ scope namespaces argument-dependent-lookup using-declaration

这是有问题的代码,出现在“C ++ Primer”的第13.3节中,5ed:

void swap(Foo &lhs, Foo &rhs)
{
    using std::swap;
    swap(lhs.h, rhs.h); // uses the HasPtr version of swap
    // swap other members of type Foo
}

本书提到了类特定交换不被使用声明隐藏的现象,并引用读者§18.2.3:

enter image description here

我阅读了该部分,并意识到这可能与Argument-Dependent Lookup(ADL)有关。以下是摘录:

enter image description here

但我的理解仍然含糊不清。我的问题是:ADL是在正常范围查找之前还是在正常范围查找之后?我目前的理解是ADL在正常范围查找之前,因为否则它应该是使用的std :: swap。如果你认为我是对的,我需要确认,或者如果你认为我错了,请指出我犯了什么错误。谢谢。

1 个答案:

答案 0 :(得分:3)

ADL以前没有去过,它不是特别优先考虑的;除了通常的名称查找找到的名称外,还将考虑ADL找到的名称。

  

除了通常的非限定名称查找所考虑的范围和名称空间之外,还会在其参数的名称空间中查找这些函数名称。

这意味着ADL找到的所有名称和通常的名称查找都将在overload resolution中考虑;然后将选择最佳匹配。

  

为了编译函数调用,编译器必须首先执行名称查找,对于函数,可能涉及依赖于参数的查找,而对于函数模板,可能后跟模板参数推断。如果这些步骤产生多个候选函数,则执行重载解析以选择实际调用的函数。