函数内的 c++ using 语句,后跟函数名称(用于 ADL?)

The c++ using statement within a function, followed by a function name (for ADL?)

What is the copy-and-swap idiom? 在这个问题中,在最上面的答案中,在实现 swap public friend 重载的部分中,实现使用了这个:

friend void swap(dumb_array& first, dumb_array& second){
    //the line of code below
    using std::swap;
    //then it calls the std::swap function on data members of the dumb_array`s
}

我的问题是:这里的using std::swap是干什么用的(答案提到了与启用ADL相关的东西);这里具体调用了“using”的什么用例,添加该行代码的效果是什么,不在代码中添加它的效果是什么?

using 语句使这一行有效:

swap(first, second);

注意我们可以省略swap前面的std::

重要的是 std::swap(...) 合格查找 ,但 swap(...) 不合格查找 .主要区别在于限定查找是在特定名称空间或范围(指定的范围)中调用函数,而非限定查找更灵活一些,因为它将查找当前上下文的父范围以及全局名称空间。此外,非限定查找还将查看参数类型的范围。这是一个很好的工具,但也很危险,因为它可以从意想不到的地方调用函数。

ADL 仅适用于非限定查找,因为它必须搜索其他名称空间和范围。

using std::swap也保证如果通过ADL没有找到函数,会默认调用std::swap

这个习惯用法允许用户定义交换函数:

struct MyType {
    // Function found only through ADL
    friend void swap(MyType& l, MyType& r) {
        // ...
    }
};