2011-09-12 14 views
7

C++ 11のドラフトの改訂版N3242から、標準ライブラリのインタフェースの一部のコンポーネント(特にスレッディングとロック)は例外処理に依存しているようです。例外を有効にする必要があるC++ 11標準ライブラリインターフェイスの一覧はありますか?

が無効にされたの作業が多いので、例外処理が有効になっていないと(実際上または論理的に)使用できないライブラリコンポーネント/機能はありますか?

+0

実際には、実際の例外がスローされるまで、すべての機能を使用できます。その後、プログラムがクラッシュします。 ライブラリ関数がスローすることができる場合、これは標準で指定されています。したがって、標準ではリストがあります。 –

+0

@ n.m。それは間違った定義を使用して私のポストを読んでいるかもしれないようだ "実質的に":http://dictionary.reference.com/browse/practically。 もしそうでなければ、 'std :: vector.at(size_t)'とプログラム/環境のスレッディングとロッキングの複雑さと局所性に違いがあります。スレッドとロックライブラリを実装しているので、前者に対して簡単かつ予測可能に防御できます。 (cont) – justin

+0

(cont)は、後者から自分自身を守る方がはるかに複雑です。物事がうまくいかない場合、未処理の例外は解決策ではありません(私たちの一部)。私はこれらのエラーを無視することはできません:)したがって、私はライブラリのスレッドとロックの実装に依存することはできませんので、ライブラリによって提供される唯一の防御は例外です。結論として、スレッドとロックのインターフェイスは、例外が無効になっているプログラムには適していません。助けてくれることを望む。 – justin

答えて

1

この質問は1ヶ月以上経過しており、返信がありません。

私はコミュニティウィキと見なすことができる回答を提供しています。必要に応じて追加します。

  • std::threadセクション30.2.2。推移。ネイティブ実装を使用して実装された抽象化。

  • std::mutexstd::recursive_mutexstd::timed_mutexstd::recursive_timed_mutexセクション30.4.1、独自の例外フリーロック(BasicLockableLockableTimedLockable経由)を指定した場合は、自動化されます。ネイティブ実装を使用して実装された抽象化。

  • std::condition_variableセクション30.5。推移。ネイティブ実装を使用して実装された抽象化。

注:もっとあります。

4

まず、(例外として)、例外とRTTIを無効にすることは、コンパイラ固有の拡張であり、標準では考慮していません。標準ライブラリ以来

は通常、コンパイラに結び付けられ、それ 標準ライブラリの 実装は、特にこれに対処するように設計されていることもあり(特に、代わりに new返すヌルポインタに対処します募集の std::bad_alloc)。

したがって、あなたが求めているのは非官能的です。完全なリストについては、自分のライブラリーの資料を調べてください。言い換えれば、標準は、は、多くの操作が決して投げないことを保証します。私は例外を呑み込む操作についてはわかりませんが、そのほとんどはそのまま安全に使用することができます。

たとえば、すべてのアルゴリズムは安全でなければなりません。

もう一度、実装ののドキュメントを読むことをおすすめします。

+0

'bad_alloc'を避けるために、一般的な' new'バリエーションがあります。 'nothrow_t'はライブラリが提供するビルトイン形式であり、他のもの(ユーザ定義のアロケータを含む)は新しいプレースメントを介してユーザ定義することができます。コレクションに対して、 'std :: vector >'を投げないアロケータを指定することができます。 (cont) – justin

+0

(cont)例外に依存しない複雑で高品質なC++プログラムがあります。あなたのポストはメリット(+1)を持っていますが、私はいくつかの一般化*をこのケースで作ることができると思います - スレッディング(安全ではない)、ロック(安全でない)、そして今はベクトル誰の人生もそれに依存しない)。 – justin

+0

@ジャスティン:それは不可能ではない、私はそれが標準ではないと言います。たとえば、 'new(nothrow_t)'が存在しても、 'vector'はそれを使わないかもしれません。さて、私はいくつかのライブラリが例外なくコンパイルされていることを知っていますが、LLVM/Clangはその一例です。しかし彼らはユーティリティクラスのほとんどを再定義しました。 –

関連する問題