为什么C++中复制构造函数不需要考虑半赋值

rd1*_*857 3 c++ oop

我读过有关避免复制赋值运算符进行半赋值的内容(它在复制项目时引发一些异常,因此赋值的目标达到新旧值混合的状态)。下面的代码提供了解决方案

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)

但它首先调用自定义的复制构造函数。为什么复制构造函数不需要像复制赋值运算符那样检查半赋值?

Chr*_*odd 5

运行构造函数时,构造函数中间抛出的异常不会破坏“先前的值”。

这本质上就是使用这个构造+交换作为赋值运算符的要点。任何异常都会在交换开始之前在 ctor 中发生,因此不会破坏所分配对象的先前值。