如何为全局命名空间中的类提供swap()?

时间:2019-04-19 00:07:36

标签: c++ namespaces argument-dependent-lookup global-namespace

对于名称空间中的类,提供swap()的正确方法是在该名称空间中定义一个自由函数(例如How to overload std::swap())。但是对于全局命名空间中的类,最佳实践是什么?

cppreference has an example with a free swap() function在全局名称空间中。
但这是我唯一看到的地方,我担心这只是一个疏忽。

2 个答案:

答案 0 :(得分:2)

通常,任何库都不应使用全局名称空间,而应仅使用主应用程序。甚至很少,谁知道您何时将其纳入自己的图书馆?

除此之外,全局作用域> 2.1:12.6 [1] 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1 10.1 11.1 12.1 是一个像其他名称空间一样的名称空间,因此,如果在其中定义类型,则相关的自由函数也将属于该名称空间。
否则,依赖于参数的查找将找不到它们。

答案 1 :(得分:0)

我认为您可以在与该类相同的名称空间中定义交换重载,即使它位于全局名称空间中。您是否正在寻找类似的东西?

#include <iostream>
#include <utility>

struct S {
    void swap(S& other)
    {
        using std::swap;
        swap(data, other.data);
    }
    int data;
};

void swap(S& lhs, S& rhs)
{
    lhs.swap(rhs);
}

int main()
{
    using std::swap;
    S a = { 10 }, b = { 20 };
    std::cout << a.data << ' ' << b.data << std::endl;
    swap(a, b);
    std::cout << a.data << ' ' << b.data << std::endl;
    return 0;
}

注意main中的using std::swap。因此,如果注释掉该类的交换重载,则代码将回退到std :: swap。