This question is compilable and deterministic.
Its output is “acabBA”.
Static local variables are initialized the first time control passes through their declaration. The first time
foo() is called,
b is attempted initialized. Its constructor is called, which first constructs all member variables. This means
A::A() is called, printing
A::A() then throws an exception, the constructor is aborted, and neither
B::a are actually considered constructed. In the catch-block,
c is printed, and then
foo() is called again. Since
b was never initialized the first time, it tries again, this time succeeding, printing
main() exits, the static variable
b is destroyed, first calling the destructor printing
B, and then destroying member variables, printing