自 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.
// ...
}
std::vector
赋值提供了强异常保证,我认为仍然需要进行分配。 - juanchopanzastd::vector
的移动赋值放弃了强异常保证。如果是这种情况,那么可以避免在拷贝和交换中涉及额外的赋值操作。但我必须去核实一下是否真的是这样。 - juanchopanza