In the n3690 C++ standard in section 3.8.1 there is this text:
The lifetime of an object of type T begins when:
— storage with the proper alignment and size for
when constructor body has finished running
This. An object that throws during construction is not guaranteed to have its invariants established, hence its lifetime doesn't start. A consequence of this is that the destructor will not get called:
#include
struct Stillborn
{
Stillborn()
{
std::cout << "inside constructor\n";
throw 42;
}
~Stillborn()
{
std::cout << "inside destructor\n";
}
};
int main()
{
try
{
Stillborn x;
}
catch (...)
{
std::cout << "inside catch block\n";
}
}
live demo. Note how "inside destructor" does not appear in the output.