gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:39:54 24 4
gpt4 key购买 nike

我在 stackOverflow 上阅读了两篇文章,一篇描述了 copy-and-swap 习语,另一篇讨论了移动语义,但我不明白为什么我们需要在移动构造函数或复制构造函数已经完成赋值运算符时进行交换对我们来说

所以根据我的理解,如果我们使用左值,赋值运算符将使用复制构造函数构造一个对象,如果是右值,它将使用移动构造函数构造一个对象,所以假设我们选择后者

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

我们已经完成了我们想要的,我们已经用移动构造函数创建了一个对象,并“窃取或获取”了我们需要的数据,那么还需要额外的交换吗?

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

这里是文章/话题

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. 我们想要将源的内容复制到目标中。
  2. 我们希望正确处理 destination 的原始内容。

因为我们有一个复制构造函数,所以第一步已经为我们完成了。我们可以将临时拷贝的内容移动到目标位置,但是第二个问题是什么?

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

请注意,Copy 和 Swap 可能比您真正需要的更重,但它永远不会失败(假设它所依赖的函数是正确的),这使它成为一个很好的起点。

关于c++ - 是否需要复制构造函数和赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50456980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com