对于名称空间中的类,提供swap()
的正确方法是在该名称空间中定义一个自由函数(例如How to overload std::swap())。但是对于全局命名空间中的类,最佳实践是什么?
cppreference has an example with a free swap()
function在全局名称空间中。
但这是我唯一看到的地方,我担心这只是一个疏忽。
答案 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。