38

在对这个问题的彻底解释之后,我试图学习和采用复制交换成语: Copy-Swap Idiom

但我发现了一些我从未见过的代码:using std::swap; // allow ADL在这个例子中

class dumb_array
{
public:
    // ...

    void swap(dumb_array& pOther) // nothrow
    {
        using std::swap; // allow ADL    /* <===== THE LINE I DONT UNDERSTAND */

        swap(mSize, pOther.mSize); // with the internal members swapped,
        swap(mArray, pOther.mArray); // *this and pOther are effectively swapped
    }
};
  1. using std::swap;函数实现的主体内部是什么意思?
  2. ADL 是什么意思?
4

3 回答 3

79

这种机制通常用于模板代码,即template <typename Value> class Foo.

现在的问题是使用哪个交换。std::swap<Value>会起作用,但可能并不理想。swap很有可能for type有更好的重载Value,但那会在哪个命名空间中呢?它几乎肯定不在std::(因为这是非法的),但很可能在Value. 可能,但远非确定。

在这种情况下,swap(myValue, anotherValue)将为您提供可能的“最佳”交换。ValueArgument Dependent Lookup 将在来自的命名空间中找到任何交换。否则该using指令将启动,std::swap<Value>并将被实例化和使用。

在您的代码中,mSize可能是一个整数类型和mArray一个指针。两者都没有关联的命名空间,并且std::swap无论如何都具有 99.9% 的确定性。因此,using std::swap;声明在这里似乎毫无用处。

于 2011-01-24T13:57:18.780 回答
13

using关键字具有作用域。

这意味着std::swap可以在关键字swap的范围内引用。using

于 2011-01-24T13:47:04.503 回答
0

通过添加using std::swap它,可以在该功能中实现更广泛的灵活性。swap 没有特定于类型的版本,因为它是一个模板,因此为任何内置类型调用 std 版本都不会产生问题。

假设类 Foo 有一个成员 h 持有类型 ExampleType 并且我们为 ExampleType 定义了一个特定于类型的交换版本:

void swap(Foo& lhs, Foo& rhs)
{
    //ERROR: This would only the call std version 
    std::swap(lhs.h, rhs.h);
}

上面的示例将仅调用 std 版本而不是我们的 ExampleType 版本。因此,通过包含using std::swap程序将调用我们定义的版本而不是std::swap

void swap(Foo& lhs, Foo& rhs)
{
    using std::swap;
    std::swap(lhs.h, rhs.h);   //Using class defined version of swap()
}

即使我们用内置函数替换了正在交换的参数,代码仍然会在没有错误的情况下执行,因为编译器会推断 std 版本将是最佳选择。此概念也称为参数相关查找或 ADL。

于 2021-10-30T20:27:09.993 回答