C ++的异常安全隐式生成赋值运算符

时间:2012-11-12 09:48:59

标签: c++ exception assignment-operator exception-safety

我的理解是C ++ 隐式生成的赋值运算符执行成员明确的复制(这似乎也由this answer确认)。但是,如果在成员复制期间抛出异常(例如因为无法分配该成员的资源),被复制的对象是否会陷入无效状态?

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

如果我们希望我们的类副本具有保证,我们必须使用 copy-and-swap 成语手动实现赋值运算符

1 个答案:

答案 0 :(得分:10)

如果你想提供一个例外保证,并且默认的赋值运算符不是非常规的,那么通常你需要写一个。

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

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

至少有一个特例。如果除了一个之外的所有数据成员都没有进行赋值,并且特殊成员具有强烈的异常安全赋值,并且是类中的第一个数据成员,则默认赋值运算符也将是非常安全的。如果你依赖它,你可能会非常谨慎地评论,但它可能会非常脆弱!