問題タブ [exception-specification]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - boost :: bindは、例外をスローする関数をバインドするときにVC++2010で機能しません
Linuxで正常にコンパイルされるコードがいくつかありますが、それをWindowsに移植しようとしています。BoostProのBoost1.50プリコンパイル済みバイナリを使用しましたが、コードをコンパイルすると、次の不可解なエラーが発生します。
このエラーは、Boostヘッダーファイルの奥深くに表示され、コードのどこに問題があるのかがわからないため、最も役に立ちません。それにもかかわらず、コードのさまざまなブロックをコメントアウトすることにより、原因としてこれに絞り込みました。
throw
関数定義で指定子を削除すると機能します。それがクラスであろうと単なる。であろうと、私が何を投げるかは関係ありませんint
。私は何か間違ったことをしていますか、それともVisual C ++で例外をスローする関数にバインドできませんか?Boost Bindのドキュメントはこれに関する問題を示唆していないようであり、GCCはどちらの方法でも問題を抱えていません。
[補足:上記のコードは私の実際のコードではありませんが、コンパイルすると同じ問題が発生します。誰かが問題を再現したい場合の些細な例にすぎないので、intを投げるのが悪いなどについてのコメントは避けてください。]
c++ - ocl::CRException の Typeinfo
g++ を使用して C++ プログラムを実行しようとしましたが、次の例外が発生します: 「ocl::CRException の typeinfo」は、CRException クラスを含む ocl 名前空間を使用しています。
OCLクラスを含むコードは次のとおりです。
c++ - C++ 例外仕様がコンパイル時にチェックされないのはなぜですか?
C++11 標準リビジョンでは、例外仕様が非推奨になったという記事を読んだところです。以前は、関数がスローする可能性のあるものを指定することは良い習慣だと思っていましたが、どうやらそうではないようです。
Herb Stutter のよく引用された記事を読んだ後、疑問に思わずにはいられません: 一体なぜ、例外仕様がそのままの形で実装されているのでしょうか? 委員会は、コンパイル時にチェックする代わりに、なぜそれらを非推奨にすることにしたのでしょうか? なぜコンパイラは、関数定義に表示されない例外のスローを許可するのでしょうか? int f()
私には、これはすべて「関数の戻り値の型を指定するべきではありません。指定すると、そのreturn 3.5;
内部でプログラムがクラッシュする可能性があるためです」と言っているように聞こえます。(つまり、強い型付けとの概念的な違いはどこにあるのでしょうか?)
(テンプレートの構文がおそらくチューリング完全であることを考えると、s での例外仕様のサポートの欠如については、typedef
これを実装するのは十分に簡単に思えます。)
c++11 - クラス外で定義されたデフォルトの移動操作の例外仕様は何ですか?
このクラスを考えてみましょう:
C1 のムーブ ctor は最初の宣言で明示的にデフォルト設定されるため、標準の 8.4.2 では、関数が暗黙的に宣言されているかのように、同じ例外仕様 (ES) を持つことが示されています。次に、15.4/14 と 12.8/15 を使用して、その ES が であると結論付けることができnoexcept(true)
ます。
次に、移動 ctor がクラス定義の外でデフォルト設定されていることを除いて、同じクラス C2 を考えてみましょう。
C2 の move ctor の ES は? 最初の宣言ではデフォルトに設定されていないため、8.4.2/2 は適用されません。明示的な ES がないため、8.4.2/3 は適用されません。暗黙的に宣言されていないため、15.4/14 は適用されません。私が知る限り、それは 15.4/12 が適用されることを意味し、デフォルト関数 ES はnoexcept(false)
.
私が正しければ、それは C1 の move ctor が であることを意味しますがnoexcept(true)
、C2 の概念的に同一の move ctor は ですnoexcept(false)
。
C2 についての私の推論は正しいですか?
c++ - 関数宣言でのコメントとしての例外指定
エラーを示す戻り値の代わりにコードで C++ 例外を使用するため、コードは例外セーフである必要があります。したがって、関数宣言にコメントとして例外仕様を追加します。例えば:
これは良い習慣ですか?
さらに、これらの仕様を作成するために自分のコードを評価する場合、C++ 例外、または nullptr の逆参照、オーバーフロー、ゼロ除算などの SEH 例外のみを考慮する必要がありますか?
C++ 例外をスローすることはありませんが、SEH 例外をスローする可能性があるサードパーティ ライブラリを使用するとします。そのライブラリの関数に依存する関数は、noexcept になることはありますか?
c++ - デストラクタが noexcept で暗黙的に宣言される C++11 への移行
noexcept
C++11 では、 C++03 からの変更点として、例外指定のないデストラクタが で暗黙的に宣言されます。したがって、C++03 でデストラクタからスローされていたコードは、C++11 でも正常にコンパイルされますが、そのようなデストラクタからスローしようとすると実行時にクラッシュします。
このようなコードにはコンパイル時エラーがないため、コード ベース内のすべての既存のデストラクタを として宣言する以外に、C++11 に安全に移行するにはどうすればよいnoexcept(false)
でしょうか。潜在的にスローされているデストラクタをすべて検査しますが、これには本当に時間がかかり、エラーが発生しやすくなります。または、実行時にすべてのクラッシュをキャッチして修正しますが、そのようなケースがすべて見つかることは保証されませんか?
c++ - std::map find() が noexcept として宣言されていないのはなぜですか?
C++14 標準では、次のように find() メンバー関数が定義std::map
されています。
これらの関数が として定義されていないのはなぜnoexcept
ですか? 例外をスローする必要があるか、未定義の動作を生成する必要がある内部で何が問題になる可能性がありますend
か?
c++ - sed を使用して C++ コードから例外仕様を削除する
非推奨の例外仕様を C++ コードから自動的に削除し、このタスクに sed を使用したいと考えています。
例外指定の形式はthrow
、括弧内に例外 (単語) のリストが続くため、この sed を作成しました。
1 回線仕様では機能しますが、複数回線仕様では機能しません。
ドキュメントによると、ドットは改行と一致しないようです: https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
この回避策を試しましたが、どちらも機能しません (実際には、oneline 仕様でも機能しません)。
適切に機能させるにはどうすればよいですか?
編集済み:
例外仕様の例: