Half Built Widget

struct A { A(){ std::puts("A ctor"); } ~A(){ std::puts("A dtor"); } };
struct B { B(){ std::puts("B ctor"); } ~B(){ std::puts("B dtor"); } };

struct Widget {
    A a;
    B b;
    Widget() { throw std::runtime_error("boom"); }
    ~Widget() { std::puts("Widget dtor"); }
};

int main() {
    try { Widget w; }
    catch (...) { std::puts("caught"); }
}

What does this print?

A

A ctor B ctor A dtor B dtor caught

B

A ctor B ctor B dtor A dtor caught

C

A ctor B ctor Widget dtor B dtor A dtor caught

D

A ctor B ctor caught