-1

c++ 11 でクラス メンバーがデフォルト値を取得するのはいつですか? 次のコードは正当ですか?

class C {
    void* buffer;
    uint16_t& crc = *reinterpret_cast <uint16_t*> (buffer);
public:
    explicit C (void* p) : buffer (p) {}
};

crc のデフォルト値は単なる構文糖衣であるため、バッファが初期化された後に crc が初期化されると思います。私は正しいですか?

4

2 に答える 2

3

非静的データメンバーの初期化の順序は、12.6.2 Initializing bases and members [class.base.init] の段落 10 で指定されています (私の強調):

非委任コンストラクターでは、初期化は次の順序で進行します。

【……拠点に関すること】

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

— 最後に、コンストラクター本体の複合ステートメントが実行されます。

ご覧のとおり、メンバーがいわゆるmem-initializer (つまり、コンストラクター内で本体の前) で初期化されているか、brace-or-equal-initializer (つまり、クラス定義内) で初期化されているか、または何も初期化されていないかどうかは、初期化順序に影響します。

于 2012-07-03T13:48:37.557 に答える
1

順序は C++11 §12.6.2[class.base.init]/10 で指定されています。データ メンバーを宣言する順序のみに依存します。buffer前に出てくるのでcrc大丈夫です。

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

于 2012-07-03T13:47:20.523 に答える