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

Does Argument-Dependent Lookup go before normal scope lookup?

这是 "C++ Primer" 的第 13.3 节中出现的相关代码,第 5 版:

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
}

书上提到了class-specificswap没有被using声明隐藏的现象,参考reader§18.2.3:

我阅读了该部分并意识到这可能与 Argument-Dependent 查找 (ADL) 有关。以下为节选:

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

ADL没去过,不是特意去的;除了通过通常的名称查找找到的名称之外,还将考虑通过 ADL 找到的名称。

These function names are looked up in the namespaces of their arguments in addition to the scopes and namespaces considered by the usual unqualified name lookup.

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

In order to compile a function call, the compiler must first perform name lookup, which, for functions, may involve argument-dependent lookup, and for function templates may be followed by template argument deduction. If these steps produce more than one candidate function, then overload resolution is performed to select the function that will actually be called.