在这个关于复制和交换的question中,在可接受的答案中有一个swap()函数。
friend void swap(dumb_array& first, dumb_array& second) // nothrow
{
// enable ADL (not necessary in our case, but good practice)
using std::swap;
// by swapping the members of two classes,
// the two classes are effectively swapped
swap(first.mSize, second.mSize);
swap(first.mArray, second.mArray);
}为什么不只是std::swap(first, second)
发布于 2015-04-15 10:22:39
std::swap依赖于赋值运算符。因此,如果赋值操作符要调用std::swap,这将导致赋值运算符和std::swap之间的无限的调用链。
关于你标题中的问题。是的,对于具有值语义的行为良好的类,对该类的对象调用std::swap是安全的。出于上述原因,只有类的实现者不能将其用于复制和交换成语。
发布于 2015-04-15 10:45:06
代码片段建议用于C++98,在相同的答案中还有另一个关于C++11 (移动语义)的建议。
swap()函数用于C++98解决方案的原因在Scott的“有效C++”一书中得到了很好的解释。
简略;
template<typename T> // typical implementation of std::swap;
void swap(T& a, T& b) // swaps a's and b's values
{
T temp(a);
a = b;
b = temp;
}只要您的类型支持复制(通过复制构造函数和复制赋值操作符),默认的交换实现将允许交换类型的对象,而不必做任何特殊的工作来支持它。 但是,默认的交换实现可能不会让您感到兴奋。它涉及到复制三个对象:a到temp,b到a,temp到b。对于某些类型,这些副本都不是真正必要的。对于此类类型,默认交换将使您进入到慢车道的快车道。 这些类型中最重要的是那些主要由指向包含实际数据的另一类型的指针组成的类型。这种设计方法的一个常见表现是"pimpl成语“。
https://stackoverflow.com/questions/29647592
复制相似问题