是否需要复制构造函数和赋值?

时间:2018-05-21 21:43:58

标签: c++ copy copying

我在stackOverflow上读了两篇文章,一篇描述了复制和交换习语,另一篇讨论了移动语义,但是当移动构造函数或复制构造函数已经完成时我无法理解为什么需要交换赋值运算符对我们来说

所以根据我所理解的解释,如果我们使用左值,赋值运算符将构造一个带有复制构造函数的对象,如果它将使用移动构造函数构造一个对象的左值,那么让我们说选择后者

假设我们有一个交换对象成员的函数,下面是赋值运算符,所以我说我们先说rvalue,operator =将用移动构造函数构造一个对象,为什么我们需要交换函数这里??

我们已经完成了我们想要的东西,我们已经使用移动构造函数创建了一个对象,并且"被盗或被采取了#34;我们需要的数据是否需要额外的交换?

我们是不是只是交换一遍做同样的事情?

这里是文章/主题

What are move semantics?

What is the copy-and-swap idiom?

dumb_array& operator=(dumb_array other) // (1)
{
    swap(*this, other); // (2)

    return *this;
}

1 个答案:

答案 0 :(得分:1)

分配对象时有两个问题:

  1. 我们想要将源内容的副本送到目的地。
  2. 我们希望正确处理目的地的原始内容。
  3. 由于我们有一个复制构造函数,所以第一步是为我们完成的。我们可以move将临时副本的内容放入目的地,但关注的是两个?

    我们有一个处理处理的析构函数,为什么不使用它呢?如果您将目的地内容换成临时内容,则临时内容的销毁可确保正确释放目的地原始内容,而无需编写新代码或复制现有代码。

    请注意,复制和交换的重量可能比实际需要的重,但它永远不会失败(假设它所依赖的功能是正确的),这使它成为一个很好的起点。