Херб Саттер в своей статье http://www.gotw.ca/gotw/047.htm указал, что мы не можем использовать uncaught_exception в функции разрушителя,
// Why the wrong solution is wrong
//
U::~U() {
try {
T t;
// do work
} catch( ... ) {
// clean up
}
}
Если объект U уничтожается из-за разматывания стека во время распространения исключения, T:: ~ T не сможет использовать путь «код, который может выбросить», даже если это безопасно.
, но я пишу тестовую программу, а T :: ~ T фактически не использовал «код»который может выбросить "
#include <exception>
#include <iostream>
using namespace std;
class T {
public:
~T() {
if( !std::uncaught_exception() )
{
cout<<"can throw"<<endl;
throw 1;
} else
{
cout<<"cannot throw"<<endl;
}
}
};
struct U
{
~U() {
try
{
T t;
}
catch( ... )
{
}
}
};
void f()
{
U u;
throw 2;
}
int main()
{
try
{
f();
}
catch(...)
{}
}
вывод: не может выбросить
я что-то пропустил?
Спасибо