You can follow the initialization process.
class A
{
Member<1> m1;
bool m1threw = true;
Member<2> m2;
bool m2threw = true;
public:
A() try
: m1()
, m1threw(false)
, m2()
, m2threw(false)
{
}
catch (std::exception const & e)
{
if (m1threw) {
}
else if (m2threw) {
}
throw;
}
};
++ 11. , , - . ,
,
template<int N>
struct Member
{
Member(int some_arg)
{
std::cout << "Non default constructor of Meber " << N << std::endl;
}
};
class A
{
Member<1> m1;
Member<2> m2;
enum TrackerType { NONE, ONE, TWO };
public:
A(TrackerType tracker = NONE)
try
: m1((tracker = ONE, 1))
, m2((tracker = TWO, 1))
{
}
catch (std::exception const & e)
{
if (tracker == ONE) {
std::cout << "m1 threw: " << e.what() << std::endl;
}
else if (tracker == TWO) {
std::cout << "m2 threw: " << e.what() << std::endl;
}
throw;
}
};
, ++ 11