很长一段时间以来,我认为实现复制分配(对于非平凡类)的正确方法是使用复制交换习语。
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
实现呢?也就是说,他们最后不使用复制交换习语吗?标准向量不需要强异常保证吗?