C++ 赋值运算符异常安全

c++ assignment operator exception safety

非常直接的问题:

为什么要求赋值运算符不能抛出异常?

同时,构造函数可以抛出?


如果您不能抛出异常,如果没有足够的内存用于缓冲区分配,如何处理众所周知的 "custom" 字符串示例?

如果你只是少分配或保持旧状态,但不抛出异常,一切都会"look"顺利,但会有严重(隐藏)错误。

完全没有这个要求。抛出作业是完全可以的。在许多情况下,抛出是不可避免的(例如,当分配必须分配一些内存并且还剩下 none 时)。

赋值不应该做的是让对象处于未定义状态。它必须要么成功地分配一个新值,要么将对象保留在其原始状态(或者可能是其他一些不太理想的有效状态)并抛出。

这种语义通常通过复制和交换习语来实现。复制阶段可以抛出。这使受让人完好无损。交换阶段绝不能抛出。