Section 3.6.3.2 of the C++03 standard says:
Destructors for initialized objects of static storage duration (declared at block scope or at namespace scope) are called as a result of returning from main and as a result of calling exit.
It doesn't give any restriction regarding having a private destructor, so basically if it gets created it will also get destroyed.
A private destructor does cause a restriction on the ability to declare an object (C++03 12.4.10)
A program is ill-formed if an object of class type or array thereof is declared and the destructor for the class is not accessible at the point of declaration
but since the destructor of A::theMainInstance is accessible at the point of declaration, your example should have no error.