例外処理中かを判定する

C++には98時代からヘッダに、std::uncaught_exception()という関数があります。
これは以下のように定義される、boolを返すだけの関数なのですが、

namespace std {
  bool uncaught_exception() noexcept;
}

この関数はある特殊な状況でのみtrueを返します。
それは、こんな状況です。


「例外が投げられてからキャッチされるまでの間、もしくはstd::terminate()を明示的に呼び出してその関数が実際に呼び出されるまでの間でtrueを返す」


こんなのどこで使えばいいのか。これは、tryブロック中で作られたオブジェクトのデストラクタでtrueになるので、オブジェクトがエラー終了した場合の破棄方法の選択として使用できます。

#include <iostream>
#include <exception>

struct X {
    ~X()
    {
        if (std::uncaught_exception()) {
            // ロギング
            std::cout << "エラー発生による破棄" << std::endl;
        }
    }
};

int main()
{
    try {
        X x;
        throw std::exception();
    }
    catch (std::exception& e) {
        std::cout << "catch" << std::endl;
    }
}
エラー発生による破棄
catch

しかし、実際にはこういう用途では使われず、メタプロ的な特殊用途で使われるんだと思います。


参照:
GotW #47 Uncaught Exceptions
std::uncaught_exception() - cpprefjp