3

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

swap()cppreference在全局命名空间中有一个带有自由函数的示例。
但这是我见过的唯一一个这样做的地方,我担心这只是一个疏忽。

4

2 回答 2

2

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

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

于 2019-04-19T00:12:09.367 回答
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;
}

注意using std::swap主要。因此,如果您注释掉类的交换重载,代码将回退到 std::swap。

于 2019-04-19T00:36:00.327 回答