4

这是出现在“C++ Primer”第 5 节第 13.3 节中的相关代码:

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
}

书中提到了特定于类的交换没有被 using 声明隐藏的现象,并请读者参考 §18.2.3:

在此处输入图像描述

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

在此处输入图像描述

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

4

1 回答 1

4

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

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

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

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

于 2017-10-17T03:53:52.003 回答