How to Avoid the "static" Initialization Order Disaster

The static initialization order disaster is a very subtle and commonly misunderstood aspect of C++. Unfortunately, it's very hard to detectthe errors occur before main() begins. This means as soon as you execute the program, it dies or lives dangerously.
Suppose you have two static objects, A and B, both of which exist in separate source files, say A.cpp and B.cpp. Further suppose that the constructor for the B object calls some method of the A object.

Now, you compile the code. If the runtime system elaborates A first, there won't be a problem. But if B is elaborated first, you are ready to face disaster.