If the completion of the constructor or dynamic initialization of an object with static
storage duration strongly happens before that of another, the completion of the destructor
of the second is sequenced before the initiation of the destructor of the first
. If the completion of the constructor or dynamic initialization of an object with thread
storage duration is sequenced before that of another, the completion of the destructor
of the second is sequenced before the initiation of the destructor of the first
. If an object is
initialized statically, the object is destroyed in the same order as if
the object was dynamically initialized
. For an object of array or class
type, all subobjects of that object are destroyed before any block
variable with static storage duration initialized during the construction
of the subobjects is destroyed
. If the destruction of an object with static or thread storage duration
exits via an exception,
the function
std::terminate is called (
[except.terminate])
.