これは、デストラクタから例外をスローしても安全かどうかについての質問ではありません。
http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.9の状態:
「スタックの巻き戻し中に、これらすべてのスタックフレーム内のすべてのローカルオブジェクトが破棄されます。これらのデストラクタの1つが例外をスローした場合(たとえば、Barオブジェクトをスローした場合)、C++ランタイムシステムは勝てない状況にあります。バーに入れて、} catch(Foo e){に最初に向かった場所に行き着きますか?Fooを無視して、} catch(Bar e){ハンドラーを探す必要がありますか?良い答えはありません。どちらを選択しても情報が失われます。」
IE:スタックの巻き戻し中に別の例外がスローされた場合、「検索」するcatchハンドラーがあいまいであるため、ランタイムシステムは勝てない状況になります。
スタックの巻き戻し中にスローされる例外自体がtry/catchブロックにある場合、上記に「例外」はありますか?この場合、あいまいさはありません。
#include <iostream>
using namespace std;
class Component
{
public:
~Component()
{
cout << "In component destructor" << endl;
try
{
throw 1;
}
catch (...)
{
cout << "Caught exception in component destructor" << endl;
}
}
};
class Container
{
public:
~Container()
{
cout << "In container destructor" << endl;
Component component;
}
}
;
int main()
{
try
{
Container cont;
throw 'a';
}
catch (...)
{
cout << "Caught main exception ok" << endl;
}
return 0;
}
以下はそれを暗示していますが、関連するC++標準セクションを誰かが知っているかどうか疑問に思いました。
「スタックの巻き戻し中にデストラクタが例外をスローし、その例外が処理されない場合、terminate()関数が呼び出されます。次の例はこれを示しています。」