26

はい、私は見つけたC ++標準(またはドラフト)を調べましたが、STLコンテナーによって提供される例外保証の包括的なものは見つかりませんでした。私が見つけることができるのは、いくつかのタイプのいくつの関数についての不完全な説明を含む時折のセクションです。または、おそらくそこにありますが、私はそれを見つけていません、私は知りません。

注:基本的にこの質問にある、人々が考えることができるすべての保証のリストを求めているわけではありません。 私はこの情報自体の信頼できる情報源を探しています。あるいは、多かれ少なかれ公式として扱うことができる情報源の無料版(たとえば、標準のドラフト)を探しています。

4

3 に答える 3

18

標準を読むのは怖いかもしれませんが (標準に戻りましょう)、Bjarne Stroustrup は彼の著書 'The C++ Programming Language' の中で、この主題に関する非常に優れた付録を書いています。彼はこの付録を

http://www.stroustrup.com/3rd_safe0.htmlhttp://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() 関数は、スワップされるコンテナーの要素を参照する参照、ポインター、または反復子を無効にしません。

上記の各セクションで指摘されている癖 (それぞれ例外安全保証と呼ばれる) は、ほとんどの場合、含まれている型のハッシュ、比較操作、およびスワップのスローとムーブのスローからの例外を処理する場合など、壁にぶつかる特別なケースに関するものです。オペレーション。

于 2012-07-28T07:48:58.777 に答える
10

n3376

23.2.1一般的なコンテナ要件[container.requirements.general]

パラグラフ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()関数は、スワップされるコンテナーの要素を参照する参照、ポインター、またはイテレーターを無効にしません。
[注:end()イテレーターはどの要素も参照しないため、無効になる可能性があります。—文末脚注]

23.2.4連想コンテナ[associative.reqmts]

23.2.4.1例外安全性の保証[associative.reqmts.except]

1連想コンテナの場合、clear()関数は例外をスローしません。コンテナのCompareオブジェクト(存在する場合)によって例外がスローされない限り、erase(k)は例外をスローしません。
2連想コンテナの場合、単一の要素を挿入する挿入または埋め込み関数内からの操作によって例外がスローされた場合、挿入は効果がありません。
3連想コンテナの場合、例外がコンテナのCompareオブジェクト(存在する場合)のスワップによってスローされない限り、スワップ関数は例外をスローしません。

23.2.5順序付けされていない連想コンテナ[unord.req]

23.2.5.1例外安全性の保証[unord.req.except]

1順序付けされていない連想コンテナの場合、clear()関数は例外をスローしません。コンテナのHashまたはPredオブジェクト(存在する場合)によって例外がスローされない限り、erase(k)は例外をスローしません。
2順序付けされていない連想コンテナーの場合、単一の要素を挿入する挿入関数またはエンプレース関数内からコンテナーのハッシュ関数以外の操作によって例外がスローされた場合、挿入は効果がありません。
3順序付けされていない連想コンテナの場合、例外がコンテナのHashまたはPredオブジェクト(存在する場合)のスワップによってスローされない限り、スワップ関数は例外をスローしません。
4順序付けされていない連想コンテナの場合、コンテナのハッシュ関数または比較関数以外のrehash()関数内から例外がスローされた場合、rehash()関数は効果がありません。

23.3.3.4deque修飾子[deque.modifiers]

void push_back(T && x); パラグラフ2

備考:Tのコピーコンストラクタ、ムーブコンストラクタ、代入演算子、ムーブ代入演算子以外で例外がスローされた場合、影響はありません。CopyInsertable以外のTのmoveコンストラクターによって例外がスローされた場合、その影響は指定されていません。

イテレータerase(const_iteratorが最初、const_iteratorが最後); パラグラフ6

スロー:Tのコピーコンストラクター、ムーブコンストラクター、代入演算子、またはムーブ代入演算子によって例外がスローされない限り、何もありません。

23.3.6.5ベクトル修飾子[vector.modifiers]

void push_back(T && x); パラグラフ2

CopyInsertable以外のTのmoveコンストラクターによって例外がスローされた場合、その影響は指定されていません。

イテレータerase(const_iteratorが最初、const_iteratorが最後); パラグラフ5

スロー:Tのコピーコンストラクター、ムーブコンストラクター、代入演算子、またはムーブ代入演算子によって例外がスローされない限り、何もありません。

于 2012-07-28T08:27:58.797 に答える
2

あなたがリンクしたドキュメント、n3337 ドラフト標準は、公式として扱うことができます。これは、C++11 標準に加えて、編集上の小さな変更を加えたものです。

簡単に読めるように意図されていないため、標準を読むことを学ぶ必要があるだけです。

特定のライブラリ操作の例外保証を見つけるには、その操作の仕様で例外に関するコメントとコメントを確認してください。関数がメンバー関数である場合は、例外の安全性に関するコメントとそれが満たす要件について型の仕様を確認してください。次に、これらの要件を満たすためにオブジェクトによって行われなければならない例外の保証について、満たされた要件を確認します。

ジェネリック型とアルゴリズムの場合は、型、アルゴリズム、またはメンバー関数によって行われるすべての例外保証を保持するために、これらの型が満たす必要がある要件を確認するために、テンプレート パラメーターに課される要件も確認します (テンプレート パラメーターが保持されない場合)。指定された要件を満たしていない場合、これらのパラメーターを使用してテンプレートを使用すると、未定義の動作が発生し、テンプレートの仕様は適用されません)。

于 2012-07-28T20:25:20.500 に答える