2015-01-02 10 views
9

私はC++ 17がintを返す、std::uncaught_exceptions()と、boolを返す、std::uncaught_exception()を置換することなぜstd :: uncaught_exceptionをstd :: uncaught_exceptionsに変更するのですか?

http://en.cppreference.com/w/cpp/error/uncaught_exception

にオーバー気づきました。

これを記述する標準のほかはここにある:それは理論的根拠を提供していない

http://isocpp.org/files/papers/n4259.pdf

それは

と言っています[注:uncaught_exceptions()> 0、例外をスローすると はstd :: terminate()(15.5.1)の呼び出しになります。 - 最後のノート]

これはあいまいです。

この変更の理由は何ですか? C++ 17または将来のバージョンの標準で複数のアクティブな例外が可能ですか?

+1

複数のアクティブな例外がすべてのバージョンのC++に存在する可能性があります。 'struct foo {〜foo(){try {新しいintをスローします; }キャッチ(...){}}}; int main(){{foo f;新しいダブルを投げる; } catch(...){}} 'は' f'を破壊するときに2つのアクティブな例外を持ちます。 – Yakk

+1

も参照[このCppCon 2015トーク](https://github.com/CppCon/CppCon2015/blob/master/Presentations/Declarative%20Control%20Flow/Declarative%20Control%20Flow%20-%20Andrei%20Alexandrescu%20-% 20CppCon%202015.pdf)のAndrei Alexandrescu氏による「ScopeGuard」とN4259の情報です。 – Adversus

答えて

18

の達人で、1998年以来、少なくとも記載されているように、

を引用する(一般的に「ScopeGuard作品を作る」に集約)根拠

があり、これはn4152た導入用紙は、第47週は、デストラクタから推移的に呼び出されるコードで、スタックアンワインディング中に呼び出される可能性があります。つまり、コード自体が実際に巻き戻しの一部として呼び出されているかどうかを正しく検出できません。例外が解消されると、uncaught_exceptionには、複数のアクティブな例外があっても、すべてが解けるように見えます。

そして

これは今日、「実際にはポータブル」ScopeGuardを作るために文書化されていないコンパイラの機能に依存している非ポータブルコードに主要な実装では、既に存在する情報、ScopeGuardリゾートの現在の実装を使用しています。これらの用途は、PS

真にポータブルできるように、このオプションは、コンパイラに既に存在している情報を公開するために単一の新しい機能を追加することを提案している。ここでは、この関数はコンパイラspeicific情報を使用して実装することができる方法の例です: https://github.com/panaseleus/stack_unwinding/blob/master/boost/exception/uncaught_exception_count.hpp

そして、それが使われている単純な例については、(boost/log/detail/format.hppboost/log/sources/record_ostream.hppを参照)は、さらにboost.logの「レコードポンプ」よりも探す必要はありません:それは可能であればそれが作成されますガードオブジェクトのデストラクタでログインするBOOST_LOG(lg) << foo();になりfooはスローしません。つまり、デストラクタが呼び出されたときの飛行中の例外の数がそれより多くない場合コンストラクタが呼び出されたときに

+8

複数のアクティブな例外が存在する可能性がある例を示す例が点灯している可能性があります。 – Yakk

-1

std :: uncaught_exception()は、スタックが巻き戻されているかどうかのみを検出します。 Herb Sutterの論文で、彼は、これはアクティブな例外があることを確実には示していないと指摘する。ハーブは、これが "ほぼ"有用であることを示しています。私はこれが本当に曖昧な状況に遭遇しました。それが私をこのポストに導いたのです。

アクティブな例外の数を返すようにstd :: uncaught_exceptions()が指定されていますが、実際には便利です。

-1

std :: uncaught_exception()はdebug/loginfoにはまだ役立つことに注意してください。これは、例外の発生元を特定するのに役立ちます。しかし、私は機能的に同意する、それはまったく役に立たない。

関連する問題