不建议使用复制交换成语?

时间:2018-07-22 08:35:16

标签: c++ copy-and-swap

很长一段时间以来,我实现复制分配(对于非平凡的类)的正确方法是使用复制交换习惯。

struct A{
   ... pointer to data
   A(A const& other){
       ... complicated stuff, allocation, loops, etc
   }
   void swap(A& other){... cheap stuff ...}
   A& operator=(A const& other){
      A tmp{other};
      swap(other);
      return *this;
   }
};

但是后来我听到了霍华德·辛南特(Howard Hinnant)的演讲https://www.youtube.com/watch?v=vLinb2fgkHk,他说复制交换的习惯对实现强例外保证是很好的,但总体而言是一个过大的杀伤力。

他在这里提到:https://youtu.be/vLinb2fgkHk?t=2616

因此,他建议显式实现复制分配,并具有一个单独的功能strong_assing(A& target, A const& source),其中包含复制交换。

我不明白的是,A& operator=(A const& other)应该如何实施?

他建议吃这样的东西吗?

   A& operator=(A const& other){
        ... don't allocate if not necessary
        ... loop element by element
        ... clean the bare minimum if there is a throw 
   }

这是std::vector实现的目的吗? 也就是说,他们最后不使用“复制交换”习惯用法吗? 标准向量不需要强异常保证吗?

0 个答案:

没有答案