18

私の理解では、C++の暗黙的に生成された代入演算子はメンバーごとのコピーを行います(これは、この回答でも確認されているようです)。しかし、メンバーのコピー中に例外がスローされた場合 (たとえば、そのメンバーのリソースを割り当てることができないため)、コピーされているオブジェクトは無効な状態でスタックしますか?

つまり、暗黙的に生成された代入演算子は基本的な保証のみを達成し、強力な保証は達成しないのでしょうか?

クラスのコピーに強力な保証が必要な場合は、コピー アンド スワップイディオムを使用して代入演算子を手動で実装する必要がありますか?

4

1 に答える 1

14

例外保証を提供したい場合で、デフォルトの代入演算子が nothrow でない場合は、通常、それを記述する必要があります。

デフォルトのコピー割り当ては、リソースがリークせず、クラスの不変条件が保持されるという基本的な保証さえ達成するとは限りません。すべてではなく一部のデータ メンバーを割り当てると、特定のクラスによっては、クラスの不変条件が満たされない状態になる可能性があります。

したがって、クラスのデフォルトの演算子を評価する必要があります-それがスローできる場合、およびスローすることによってオブジェクトを「無効な」状態のままにしておく場合は、それを抑制する必要があります。または、定義されたクラスの不変条件を弱めますが、それはユーザーにとってあまり役に立ちません。

(少なくとも) 1 つの特殊なケースがあります。1 つを除くすべてのデータ メンバーに非スロー代入があり、特別なメンバーに強力な例外セーフ代入があり、クラスの最初のデータ メンバーである場合、既定の代入演算子も強力に安全です。信頼している場合は、非常に慎重にコメントする必要があるかもしれませんが、非常に壊れやすいことが判明する可能性があります。

于 2012-11-12T09:52:09.517 に答える