初期化リストの初期化順

初期化リストでのメンバ変数の初期化は宣言順に行われるらしい。

#include <iostream>

class CTest{
public:
    int mValue1;
    int mValue2;
    CTest():mValue1(10),mValue2(mValue1+10){}
};

int main()
{
    using namespace std;
    CTest Test;
    cout << Test.mValue2 << ends;
}

実行結果

20

これはOK

#include <iostream>

class CTest{
public:
    int mValue2;
    int mValue1;
    CTest():mValue1(10),mValue2(mValue1+10){}
};

int main()
{
    using namespace std;
    CTest Test;
    cout << Test.mValue2 << ends;
}

実行結果

4262250

明らかにおかしい。

初期化子の記述の順番に関係なく宣言順に初期化されるため、
mValue2の初期化子の中で呼んでいるmValue1がまだ初期化され
ていないのが原因らしい。

ちなみにググったら
warning: `CTest::mValue1' will be initialized after
的な警告が出るみたいなんだけど

gcc3.4.4 -Wallオプション付き
VC8 /W4 オプション

で共に何も警告されず。ぬー。

あれ?

勘違い、gcc3.4.4では警告された。