current_exception()の失敗

current_exception()が失敗したら、std::bad_alloc用のexception_ptrを返すようにしました。
<hamigaki/exception/msvc/exception.hpp>の差分
std::bad_alloc用のexception_ptrをstaticに持つ方法もありますが、ヘッダonlyで済ませたかったこともあり、exception_ptrに特殊な状態を追加して、これでstd::bad_allocを表現することにしました。

exception_ptr(void* data, const ::_s__ThrowInfo* info) : info_(info)
{
    try
    {
        // ...
    }
    catch (...)
    {
        // std::bad_allocを示す状態にする
        data_.reset(0);
        info_ = reinterpret_cast<const ::_s__ThrowInfo*>(~0);
    }
}

void rethrow()
{
    // std::bad_alloc状態なら単にstd::bad_allocを送出する
    if ((data_.get() == 0) && (info_ != 0))
        throw std::bad_alloc();

    // ...
}

ドラフトではcurrent_exception()内部でstd::bad_alloc以外の例外が発生した場合の挙動が規定されていないように読めるのですが、current_exception()自体は「Throws: nothing.」なので、std::bad_allocの場合と同じ扱いにしています。


テストコードでは、フラグで成否を変更できるnewやコピーコンストラクタを用意してテストしています。
copy_failed_test.cpp
この手のチェックは難しいですね。