对于命名空间中的类,提供的正确方法swap()
是在该命名空间中定义一个自由函数(例如如何重载 std::swap())。但是对于全局命名空间中的类,最佳实践是什么?
swap()
cppreference在全局命名空间中有一个带有自由函数的示例。
但这是我见过的唯一一个这样做的地方,我担心这只是一个疏忽。
对于命名空间中的类,提供的正确方法swap()
是在该命名空间中定义一个自由函数(例如如何重载 std::swap())。但是对于全局命名空间中的类,最佳实践是什么?
swap()
cppreference在全局命名空间中有一个带有自由函数的示例。
但这是我见过的唯一一个这样做的地方,我担心这只是一个疏忽。
一般来说,没有库应该使用全局命名空间,只有主应用程序。甚至很少,谁知道你什么时候会把它的一部分变成自己的图书馆?
除此之外,全局作用域::
和其他任何命名空间一样是一个命名空间,因此如果您在那里定义一个类型,相关的自由函数也属于那里。
否则,依赖于参数的查找无法找到它们。
我认为你可以在与类相同的命名空间中定义一个交换重载,即使它在全局命名空间中。你在寻找这样的东西吗?
#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。