总是使用 std::swap
来实现我的复制赋值运算符是一个很好的通用做法吗?我的理解是,这提供了一种共享复制构造函数实现的方法。我想避免复制实际的复制逻辑本身。所以这就是我要做的:
class Foo
{
public:
Foo(Foo const& other) { /* assume valid implementation */ }
Foo& operator= (Foo other)
{
std::swap(*this, other);
return *this;
}
};
将“other”传递给赋值运算符的行为执行复制构造(此时我们已经共享了复制逻辑)。我假设交换将调用移动构造(这里有一个编译器生成的实现)。
我几乎对每个实现复制构造的类都这样做,因为赋值和构造函数从来没有不同的实现。
最佳答案
您的代码没有移动构造函数。您的复制构造函数会阻止自动创建移动构造函数,并试图移动您的类而不是复制它。
对于 move-assign,您的 operator=
也会阻止其自动执行,并且可以在其位置使用。
最终结果是an infinite recursive call of =
(live code) .
如果遵循 0 规则,则不需要复制构造函数、移动构造函数、移动赋值、复制赋值或析构函数。如果你写了其中任何一个,你应该准备好写所有的。
使用 std::swap
可能很有用,但是因为你必须编写你的移动赋值和移动构造,所以根据 std::swap
来做是等待发生的无限递归。
关于c++ - 复制赋值运算符应该作为一般规则利用 std::swap 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25942131/