自 2011 年以来,我们既有复制任务,也有移动任务。然而,这个答案非常有说服力地证明,对于资源管理类,只需要一个赋值运算符。例如std::vector
,这看起来像
vector& vector::operator=(vector other)
{
swap(other);
return*this;
}
这里重要的一点是,论点是按价值衡量的。这意味着在输入函数体的那一刻,大部分工作已经通过构造函数完成other
(如果可能,通过移动构造函数,否则通过复制构造函数)。因此,这会自动正确地实现复制和移动分配。
如果这是正确的,为什么(至少根据本文档)std::vector
没有以这种方式实现?
编辑以解释这是如何工作的。other
考虑以下示例中上述代码中发生的情况
void foo(std::vector<bar> &&x)
{
auto y=x; // other is copy constructed
auto z=std::move(x); // other is move constructed, no copy is ever made.
// ...
}