我读过有关避免复制赋值运算符进行半赋值的内容(它在复制项目时引发一些异常,因此赋值的目标达到新旧值混合的状态)。下面的代码提供了解决方案
Matrix& Matrix::operator=(const Matrix& m)
{
Matrix tmp{m};
swap(tmp, *this); // only be called when copy succeeds
return *this;
}
Run Code Online (Sandbox Code Playgroud)
但它首先调用自定义的复制构造函数。为什么复制构造函数不需要像复制赋值运算符那样检查半赋值?
运行构造函数时,构造函数中间抛出的异常不会破坏“先前的值”。
这本质上就是使用这个构造+交换作为赋值运算符的要点。任何异常都会在交换开始之前在 ctor 中发生,因此不会破坏所分配对象的先前值。