为什么使用swap来实现拷贝分配?

时间:2013-11-09 19:28:19

标签: c++

在这里:http://en.m.wikipedia.org/wiki/Rule_of_three_(C++_programming)

/** Copy Assignment Operator */ 
Foo& operator= (const Foo& other) { 
  Foo temporary (other); 
  std::swap (data, temporary.data); 
  return *this;
 }

在该示例中,它使用std::swap与临时交换数据。我们为什么要创建临时和交换?复制不是更快吗?我也在其他地方看到了这个并且感到困惑。

3 个答案:

答案 0 :(得分:5)

交换技巧是确保exception safety的一种相当简单的方法。

如果你进行逐字段复制,并在中间获得异常,你的对象可能会以不一致的状态结束(除非你采取措施解决这个问题,这可能会使事情变得复杂)。

使用基于交换的实现,如果Foo temporary (other)抛出,您的对象将保持原始状态不变。

答案 1 :(得分:1)

另外,要启用copy elision和(c ++ 11)移动语义:

Foo& operator= (Foo other) { 
  std::swap(data, other.data); 
  return *this;
}

答案 2 :(得分:0)

这是为了避免不一致的状态,或者为了使异常安全,我们会说更好的词。

您还可以查看此相关主题: - What is the copy-and-swap idiom?

GManNickG在上述帖子中提到: -

  

它通过使用copy-constructor的功能来创建一个   数据的本地副本,然后通过交换获取复制的数据   功能,用新数据交换旧数据。临时副本   然后破坏,用它来获取旧数据。我们留下了一份副本   新数据。

     

为了使用复制和交换习惯用法,我们需要三件事:a   工作复制构造函数,一个工作析构函数(两者都是   任何包装器,所以应该是完整的)和交换功能。

     

交换函数是一种非投掷函数,可以交换a的两个对象   班级,会员。我们可能会想要使用std :: swap   提供我们自己的,但这是不可能的; std :: swap使用   其中的复制构造函数和复制赋值运算符   实现,我们最终将尝试定义任务   运营商本身!

同时检查Why do some people use swap for move assignments?