Как лучше обработать исключение возникающее в конструкторе не включая в try-блок ничего кроме вызова этого конструктора, в том числе не включая объявления переменной создаваемой этим конструктором в стеке? Придумал два варианта, один хуже другого:
#include <cstdlib>
#include <iostream>
#include <new>
using namespace std;
class E {};
class X {
public:
X(int i)
{
if (i % 2)
throw E();
}
};
void f(X const&, int i)
{
if (i % 3)
throw E();
}
int main(int argc, char*[])
{
#ifdef USE_PLACEMENT_NEW
char x_place[sizeof(X)];
X* x_ptr;
try {
x_ptr = new (x_place) X(argc);
}
catch (E const&) {
cerr << "Exception in X::X(int)\n";
return 1;
}
X& x = *x_ptr;
#else
struct x : X {
x(int i) try : X(i) {}
catch (E const&) {
cerr << "Exception in X::X(int)\n";
exit(1);
}
} x(argc);
#endif
f(x, argc);
}