次のように定義されたデストラクタを持ついくつかの C++ クラスを見てきました。
class someClass
{
public:
someClass();
~someClass() throw();
};
これは良い考えですか?
デストラクタが例外をスローしてはならないことは十分承知していますが、実際にデストラクタで例外をスローすることはできますか? 私はそれが何を保証するのか100%確信が持てません。
参考:この最近の質問
次のように定義されたデストラクタを持ついくつかの C++ クラスを見てきました。
class someClass
{
public:
someClass();
~someClass() throw();
};
これは良い考えですか?
デストラクタが例外をスローしてはならないことは十分承知していますが、実際にデストラクタで例外をスローすることはできますか? 私はそれが何を保証するのか100%確信が持てません。
参考:この最近の質問
デストラクタからの例外のスローを妨げるものではありません。コンパイラは引き続きそれを可能にします。違いは、そのデストラクタからの例外のエスケープを許可すると、プログラムはすぐに を呼び出すことunexpected
です。その関数はunexpected_handler
、デフォルトで を指しているものを呼び出しますterminate
。したがって、予期しない例外を処理するために何かをしない限り、プログラムは終了しますが、これはまったく悪い考えではありません。結局のところ、例外が本当に予期しないものである場合は、プログラムがそれを処理するためにできることは実際には何もありません。
これはデストラクタにとって特別なことではありません。すべてのメソッドの例外仕様に同じ規則が適用されます。
それはひどい考えではありません。例外が伝播されていないときに dtor をスローすると、すぐに中止され、スローしない実際の dtor を作成するのを忘れたことがわかります。
一方、throw 仕様を省略した場合、実際に例外がスローされたときにのみ、悪い dtor 実装について知ることができます。