【问题标题】:When is copy-and-swap idiom not applicable什么时候复制和交换习语不适用
【发布时间】:2016-02-17 12:31:00
【问题描述】:

在阅读this 关于复制和交换习语后,我阅读了this,它在 (2) 下说:

class_name & class_name :: operator= ( const class_name & )     (2)     

(2) 复制赋值运算符的典型声明 复制和交换成语不能使用

我们什么时候应该避免使用复制和交换习语?

什么时候它完全“不能使用”?

是否存在复制和交换和零规则都不适用的现实案例?

我确实找到了这个question,但它太具体了,并且没有包含任何关于如何识别此类案例的指南。

【问题讨论】:

  • 通常,复制和交换是简单安全的,但从速度的角度来看可能不是最佳的。例如,分配两个包含一百万个元素的容器,执行一百万个分配可能比执行一百万个构造和一百万个销毁更快。
  • @user2079303 谢谢,那句话喝醉了,该回家了。希望现在更清楚了
  • 复制/交换会影响您的性能的真实案例:stackoverflow.com/a/25942402/576911

标签: c++ copy-and-swap


【解决方案1】:

我们什么时候应该避免使用复制和交换习语?

当您可以证明原始副本比swap 安全且快速时。

您可以识别没有拥有对象的成员指针(既不是智能指针也不是原始指针)的情况,并且对于所有成员对象都是如此。

什么时候它完全“不能使用”?

类型不是swappable时不能使用复制和交换。

要可交换,类型必须是可移动构造和可移动分配,或者您必须定义了swap 成员函数或友元函数。

【讨论】:

    【解决方案2】:

    您描述赋值运算符的潜在实现的链接将class_name& class_name::operator=(class_name) 描述为:

    可以使用复制和交换习语时复制赋值运算符的典型声明

    class_name& class_name::operator=(const class_name&) 一样:

    无法使用复制和交换习语时复制赋值运算符的典型声明

    excellent answer to your linked question 中所述,基本上我们总是希望尽可能使用复制和交换,因为它会通过自分配测试。

    所以现在的问题是为什么http://www.cppreference.com 上提到的约定?

    假设我正在为一个虚拟类实现一个复制构造函数,并且我想向任何将要继承的人明确表示他们应该使用复制和交换习语。我该怎么做?我可以通过在初次通话中为他们制作副本来帮助他们:

    class_name& class_name::operator=(class_name)
    

    这是按值复制的,因此任何子类的实现者都会看到我已经为他们制作了副本,所以他们需要做的就是交换。

    现在,如果我有一个 class_name,其中包含一个无法复制构造的成员,例如,如果我的班级有一个 unique_ptr 以至于它不能被复制构造怎么办。我可以通过 not 向赋值运算符复制值参数来表示,例如:

    class_name& class_name::operator(const class_name&)
    

    表明它将在任何子类的实现者身上,以确保进行充分的检查以通过自分配测试。

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 2011-10-28
      • 2011-01-09
      • 2019-02-21
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多