0

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

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实现呢?也就是说,他们最后不使用复制交换习语吗?标准向量不需要强异常保证吗?

4

0 回答 0