通常,给定某种类型T
,要实现复制和移动赋值,需要两个函数
T& operator=(T&&) { ... }
T& operator=(const T&) { ... }
最近,我开始意识到一个人就足够了
T& operator=(T v) {
swap(v);
return *this;
}
此版本利用了复制/移动构造函数。分配是复制还是移动取决于如何v
构造。这个版本甚至可能比第一个版本更快,因为按值传递为编译器优化提供了更多空间 [1]。那么,第一个版本比第二个版本甚至标准库都使用它的优势是什么?
[1] 我想这解释了为什么标记和函数对象在标准库中按值传递。