メンバ変数の宣言順とコンストラクタ初期化子の順番が違うと怒られる

お仕事中、こんなビルド警告に遭遇しました。

class Foo
{
  double d;
  int    i;

public:
  Foo( int i, double d ) :i(i), d(d){}
};

int main( void )
{
  Foo	foo( 1, 3.14 );
  return 0;
}

このコード (test.cpp) を -Wall オプション付きでビルドするとこんな感じで怒られます。

C:\tmp\cpp>g++ test.cpp -Wall
test.cpp: In constructor `Foo::Foo(int, double)':
test.cpp:4: warning: `Foo::i' will be initialized after
test.cpp:3: warning:   `double Foo::d'
test.cpp:7: warning:   when initialized here

メンバ変数 d と i の宣言順と、コンストラクタ初期化子での記述順が違うとでる警告です。しかしなぜそうなるのか、正直よくわかりません。う、にゅう・・・。



困ったときのリップマン先生! というわけで、「にわかC++プログラマのバイブル」こと C++ Primer で確認すると

最善手: コンストラクタ初期化子リスのメンバ順序を定義順にするのがよい。さらに、できれば、あるメンバを初期化するのに他のメンバを初期化しないようにせよ。

とあります。なぜなら、上記コード(Fooクラス)場合、コンストラクタ初期化子リストの書き順(i→d)に関係なく、 d が i より先に定義されているので、d→i の順番で初期化されるからなんだそうです。


・・・

え〜〜〜〜〜っ。