是否应该在堆栈展开期间销毁的对象的析构函数中使用std::current_exception?

Documentation on cppreference说:



但是对于我来说不清楚堆栈展开是否是异常处理的一部分。

在stackoverflow上的一些highest-ranked answer中,作者假设这是可能的。

我在编译器(g++(Ubuntu 4.8.2-19ubuntu1)4.8.2)上进行了一些测试,在这种情况下,似乎std::current_exception返回空指针。

#include <exception>
#include <stdexcept>
#include <iostream>


struct A
{
    ~A()
    {
        std::clog << "in destructor"<<std::endl;
        std::clog << "uncaught_exception: " << std::uncaught_exception() << std::endl;
        std::clog << "current_exception: " << (bool)std::current_exception() << std::endl;
    }
};

int main(int argc, char **)
{
    try
    {
        A aa;
        std::clog << "before throw"<<std::endl;
        if(argc>1)
            throw std::runtime_error("oh no");
    }
    catch(...)
    {
        std::clog << "in catch block"<<std::endl;
        std::clog << "uncaught_exception: " << std::uncaught_exception() << std::endl;
        std::clog << "current_exception: " << (bool)std::current_exception() << std::endl;
    }

    return 0;
}

输出为:
before throw
in destructor
uncaught_exception: 1
current_exception: 0
in catch block
uncaught_exception: 0
current_exception: 1

有人知道标准怎么说吗?

最佳答案

C++标准在第18.8.5节[传播]中定义 current_exception() :

(强调我的)



以及第15.3节[句柄除外],注释7和8:



current_exception() 返回的异常被定义为“当前处理的异常”,这是最新 Activity 的处理程序的异常,并且仅当堆栈展开操作完成时,处理程序才处于 Activity 状态。

如您的测试所示,在堆栈展开期间没有“ Activity 处理程序”,因此也没有“当前处理的异常”:在这种情况下, current_exception() 将返回空exception_ptr

07-26 09:35