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