Можно ли использовать std:: current_exception внутри деструкторов объектов, которые были уничтожены во время разматывания стека?
Документация по cppreference говорит:
Если вызов во время обработки исключений (как правило, в предложении catch) захватывает текущий объект исключения (...)
Но мне непонятно, является ли перераспределение стека частью обработки исключений.
В некотором ответе с наивысшим рангом в файле stackoverflow автор предполагает, что это возможно.
Я сделал некоторый тест на моем компиляторе (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
Кто-нибудь знает, что говорит стандарт?