標準を読むのは怖いかもしれませんが (標準に戻りましょう)、Bjarne Stroustrup は彼の著書 'The C++ Programming Language' の中で、この主題に関する非常に優れた付録を書いています。彼はこの付録を
http://www.stroustrup.com/3rd_safe0.html、
http://www.stroustrup.com/3rd_safe.pdf
それはかなり長くて詳細です(そしてよく書かれています)。たとえば、セクション E.4 の興味深い引用を見つけることができます。
E.4 標準コンテナ保証
ライブラリ操作自体が例外をスローした場合、操作対象のオブジェクトが適切に定義された状態のままであることを確認できます。たとえば、 at() が vector に対して out_of_range をスローする (§16.3.3) ことは、 vector の例外安全性の問題ではありません。at() の作成者は、スローする前にベクトルが適切に定義された状態であることを確認することに何の問題もありません。
さらに、セクション E.4.1 は次のように述べています。
基本的な保証に加えて、標準ライブラリは、要素を挿入または削除するいくつかの操作に対して強力な保証を提供します。
956 ページをご覧ください。これには、vector、deque、list、および map のさまざまな操作に対する保証の表が含まれています。
要約すると、基本的な保証を提供するマップへの N 要素の挿入を除いて、これらのコンテナーに対するすべての操作は、nothrow または strong のいずれかです。
注: 上記のテキストは古く、C++11 には対応していませんが、ほとんどの目的には十分に正しいはずです。
C++11といえば…
コンテナに関する標準的な最初の状態
array, deque, forward_list, list, vector, map, set, unordered_map, unordered_set, queue,stack
:
23.2.1/10 :
別段の指定がない限り (23.2.4.1、23.2.5.1、23.3.3.4、および 23.3.6.5 を参照)、この条項で定義されているすべてのコンテナーの種類は、次の追加要件を満たしています。
— 単一要素の挿入中に insert() または emplace() 関数によって例外がスローされた場合、その関数は影響を与えません。
— push_back() または push_front() 関数によって例外がスローされた場合、その関数は何の効果もありません。
— erase()、clear()、pop_back()、または pop_front() 関数は例外をスローしません。
— 返された反復子のコピー コンストラクターまたは代入演算子は、例外をスローしません。
— swap() 関数は例外をスローしません。
— swap() 関数は、スワップされるコンテナーの要素を参照する参照、ポインター、または反復子を無効にしません。
上記の各セクションで指摘されている癖 (それぞれ例外安全保証と呼ばれる) は、ほとんどの場合、含まれている型のハッシュ、比較操作、およびスワップのスローとムーブのスローからの例外を処理する場合など、壁にぶつかる特別なケースに関するものです。オペレーション。