【发布时间】:2018-10-31 14:10:06
【问题描述】:
我在 stackOverflow 上阅读了两篇文章,一篇描述了复制和交换习语,另一篇讨论了移动语义,但我不明白为什么我们需要在移动构造函数或复制构造函数已经完成的情况下交换赋值运算符对我们来说
所以根据我的理解,如果我们使用左值,赋值运算符将使用复制构造函数构造一个对象,如果右值将使用移动构造函数构造一个对象,那么假设我们选择后者
假设我们有一个交换对象成员的函数,下面是赋值运算符,所以正如我所说,假设我们首先有一个右值,operator= 将使用移动构造函数构造一个对象,那么为什么我们需要交换函数在这里??
我们已经完成了我们想要的我们已经使用移动构造函数创建了一个对象并“窃取或获取”了我们需要的数据,那么额外的交换需要什么?
我们不是只是在交换一遍一遍做同样的事情吗?
这里是文章/主题
What is the copy-and-swap idiom?
dumb_array& operator=(dumb_array other) // (1)
{
swap(*this, other); // (2)
return *this;
}
【问题讨论】:
-
复制构造函数总是创建一个新对象,而赋值运算符永远不会。所以,是的,你需要两者。
-
你把东西偷到
other,现在你想把它换成*this