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

How to provide swap() for a class in the global namespace?

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

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

一般来说,没有库应该使用全局命名空间,只有主应用程序才应该使用。即使很少见,谁知道你什么时候会把它的一部分变成自己的图书馆?

除此之外,全局范围 :: 和其他名称空间一样是一个命名空间,因此如果您在那里定义类型,相关的自由函数也属于那里。
否则,依赖于参数的查找无法找到它们。

我认为您可以在与 class 相同的命名空间中定义一个交换重载,即使它在全局命名空间中。您在找这样的东西吗?

#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。因此,如果您注释掉 class 的交换重载,代码将回退到 std::swap.