アンドレイ・アレキサンドレスクのエラー処理に関する講演中:
C ++およびBeyond2012:Andrei Alexandrescu-C ++での体系的なエラー処理(約30分)を参照してください。
Andreiは、次のコードを提示します。
~Expected()
{
using std::exception_ptr;
if (gotHam) ham.~T();
else spam.~exception_ptr();
}
このデストラクタは、union
あるタイプT
またはのいずれかを含むをクリーンアップしていますstd::exception_ptr
。ユニオンは、を使用して設定されplacement new
ます。
次にAndreiはusing std::exception_ptr;
、次のコードは解析しないため、が必要であると説明します。
else spam.~std::exception_ptr();
つまり、別の名前空間にあるクラスのデストラクタを明示的に呼び出す必要がある場合は、usingディレクティブが常に必要です。
2番目の例が解析されないのはなぜですか?
次のコードは有効な代替手段ですか?
else delete spam;
これは、のデストラクタを明示的に呼び出すのと同じ効果がありますか?std::exception_ptr