c++赋值操作符异常安全

c++ assignment operator exception safety

本文关键字:安全 异常 赋值操作符 c++      更新时间:2023-10-16

非常直接的问题:

要求赋值操作符不能抛出异常的原因是什么?

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


如果你必须不抛出异常,如何处理众所周知的"自定义"字符串的例子,如果没有足够的内存缓冲区分配?

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

绝对没有这样的要求。赋值抛出是完全可以的。在许多情况下,抛出是不可避免的(例如,当赋值必须分配一些内存而没有剩余内存时)。

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

这个语义通常由复制-交换习惯用法实现。复制阶段可以扔。这使得受让人完好无损。