c++ - 类方法实现主体内的 `using std::swap` 是什么意思?

标签 c++ stl std using argument-dependent-lookup

我试图学习和采用复制交换习语,遵循对这个问题的全面解释:the Copy-Swap Idiom .

但我发现了一些我从未见过的代码:using std::swap;//在这个例子中允许 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 是什么意思?

最佳答案

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

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

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

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

关于c++ - 类方法实现主体内的 `using std::swap` 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4782692/

相关文章:

在结构中声明 vector 时,C++ 不是类型错误

c++ - std::locale 取得所有权

c++ - 如何显式调用 std 迭代器的析构函数?

c++ - 将模板类从 C++ 库导出到 VB.NET 和 C#

c++ - 使用 Char 数组的 ROT13 实现

c++ - 在基类中,如何定义一个容器来包含可以是派生类的任何函数的函数对象?

c++ - std::vector 在哪里分配内存?

c - 在 'c' 程序中使用 gcc/g++ 在 stdc++ 中编译时出现问题

c++ - 计算数组的平均值

c++ - 是否有 std::noncopyable (或等价物)?