web-dev-qa-db-ja.com

コンストラクター初期化リストの評価順序

私はいくつかの引数を取るコンストラクタを持っています。私はそれらがリストされた順序で構築されたと想定していましたが、ある場合には、それらは逆に構築され、結果として中止になりました。引数を逆にすると、プログラムは中断しなくなりました。これは私が使用している構文の例です。問題は、この場合、b_の前にa_を初期化する必要があるということです。建設の順序を保証できますか?

例えば.

class A
{
  public:
    A(OtherClass o, string x, int y) :
      a_(o), b_(a_, x, y) { }

    OtherClass a_;
    AnotherClass b_;
};
242
Matt

クラス内のメンバー変数宣言の順序に依存します。したがって、例ではa_が最初のものであり、b_が2番目のものです。

268
AraK

明確にするために、標準を引用するには:

12.6.2.5

初期化は次の順序で進めます。

...

  • 次に、非静的データメンバーは、クラス定義で宣言された順序で初期化されます(メモリ初期化子の順序に関係なく)。

...

190
GManNickG

これに対する 標準参照 は、12.6.2セクション13.3のようになります。

(13.3)—次に、非静的データメンバーは、クラス定義で宣言された順序で初期化されます(メモリ初期化子の順序に関係なく)。

14
Adam Getchell