initialized after

たまに出て、なんなんだろうなぁと思っていたこの警告。

foo.cpp:37: warning: 'Foo::bar' will be initialized after

調べてみると

メンバ変数 d と i の宣言順と、コンストラクタ初期化子での記述順が違うとでる警告です。

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

なるほどなるほど。宣言順に初期化されるからなのね。


手元の Effective C++ (第二版) の第13項によると、初期化リストの順とは関係なく宣言順にメンバ変数が初期化される理由は、
「デストラクタはコンストラクタとは逆の順番に呼び出されなければならない」
というルールがあるからだそうです。


例えば、二種類のコンストラクタを定義し、その初期化リストの順序が違う場合。
初期化リスト順に変数を初期化すると、オブジェクトごとにどちらのコンストラクタで作られたかを覚えておき、それに応じてデストラクタの挙動を変えなければならなくなり、そんなアホらしいことやってられっか! という理由だそうです。