18

我的理解是 C++隐式生成的赋值运算符会按成员进行复制(这似乎也被这个答案证实了)。但是,如果在成员复制期间抛出异常(例如,因为无法分配该成员的资源),被复制的对象是否会陷入无效状态?

换句话说,隐式生成的赋值运算符是否只实现了基本保证,而不是强保证?

如果我们想为我们的类副本提供强有力的保证,我们是否必须使用复制和交换习语手动实现赋值运算符?

4

1 回答 1

14

如果您想提供异常保证,并且默认赋值运算符不是 nothrow,那么通常您需要编写一个。

默认的复制分配甚至不一定能达到基本的保证,即没有资源泄漏并且类不变量被保留。分配一些数据成员但不是全部可能会使目标处于不满足类不变量的状态,具体取决于特定的类。

所以你必须评估你的类的默认运算符——如果它可以抛出,并且通过抛出使对象处于“无效”状态,那么你必须抑制它。或者削弱定义的类不变量,但这对用户没有多大帮助。

有(至少)一种特殊情况。如果除了一个之外的所有数据成员都没有赋值,并且特殊的具有强异常安全赋值,并且是类中的第一个数据成员,那么默认赋值运算符也将是强安全的。如果您依赖它,您可能需要非常仔细地评论它,但是,它可能被证明非常脆弱!

于 2012-11-12T09:52:09.517 回答