14

そのため、C++ 標準では、コンストラクターの初期化子リストに記載されている順序ではなく、クラスで宣言されている順序でクラス メンバーを初期化する必要があります。ただし、これは、これらの初期化への引数が評価される順序については何も意味しません。シリアル化オブジェクトへの参照を頻繁に渡すシステムで作業しており、オブジェクトのフィールドにビットが書き込まれる順序とは無関係に、ビットが正しい順序で読み取られるようにできるかどうか疑問に思っています。

struct Foo {
    int a;
    double b;
    // I want to be able to do this
    Foo(SerObj &s)
    : b(s.readDouble()), a(s.readInt())
    { }
    // Rather than this
    Foo (SerObj &s)
    {
        b = s.readDouble();
        a = s.readInt();
    }
};

ints明らかに、宣言内のやのようなものを並べ替えるdoublesのはそれほど大したことではありませんが、より大きなオブジェクトや動的割り当てを必要とするものは、場合によってはそうなる場合があります。

4

1 に答える 1

23

C++ 標準12.6.2/3:

各ベースとメンバーの初期化の後に、シーケンス ポイント (1.9) があります。mem-initializer の式リストは、対応するベースまたはメンバーの初期化の一部として評価されます。

初期化の順序は、質問で指定した順序です。評価はこの初期化の一部であり、初期化はインターリーブできません (それらの間にシーケンス ポイントがあるため)。

つまり、初期化子リスト内の関数呼び出しは、目的の順序ではなく、メンバー宣言が表示される順序で呼び出されます。

于 2009-10-19T17:23:28.230 に答える