C++のmain前の初期化順序の問題なんだけど

int i=0;
struct A {
 A() {i=1;}
 static A & a() {
  static A a;
  return a;
 }
 private: static A * ap; // (*)
};
A * A::ap=&A::a(); // (*)

int main() {
 A & ap=A::a(); // (**)
 return 0;
}

(*)の部分がない場合は(**)の呼び出し前後でiの値が
変わることになる。(*)の部分があるとmainの呼び出し前に
A::a()の呼び出しが行われているみたいだけど、
これってC++の仕様的に保証されているのでしょうか?
Singletonのインスタンスにmain前にアクセス可能にする場合
上みたいに実装すること思うけど、スレッド安全性の確保の
為に、main前にはA::a()が呼び出されていて欲しくてこんな風に
してみた。まあ、mainの先頭で手動で呼び出してもいいんだけど。
apに誰もアクセスしないので最適化で消えちゃうかなあ?