Skip to content

Latest commit

 

History

History
79 lines (58 loc) · 2.31 KB

default_member_initializers_for_bit_fields.md

File metadata and controls

79 lines (58 loc) · 2.31 KB

ビットフィールドのメンバ変数初期化

  • cpp20[meta cpp]

概要

C++11で導入された非静的メンバ変数の初期化子では、ビットフィールドは対象外であった。

C++20では、ビットフィールドのメンバ変数も、定義時に初期化ができるようになる。

struct X {
  int x : 6 = 8; // 6ビットを持つビットフィールドメンバ変数xを、値8で初期化
  int y : 2 {1};  // 2ビットを持つビットフィールドメンバ変数yを、値1で初期化
};

ただし以下のような状況では、最長マッチによって意図通りに動作しない場合がある:

int bits;
struct X {
  int a : true ? 8 : bits = 2; // int a : (true ? 8 : bits = 2)
  int b : 1 || new int { 0 };  // int b : (1 || new int {0})
};

こういった場合には、丸カッコで囲まなければならない:

int bits;
struct X {
  int a : (true ? 8 : bits) = 2;
  int b : (1 || new int) { 0 };
};

仕様

  • ビットフィールド初期化の構文は以下のようになる:

    型 変数名(省略可) 属性(省略可) : 定数式のビット幅(省略可) 波カッコもしくは代入構文による初期化子(省略可)
    
  • ビットフィールドの初期値は、非ビットフィールドのメンバ変数初期化と同様にデフォルト値である。コンストラクタで明示的にビットフィールドを初期化した場合、デフォルト値ではなく指定された初期値で初期化される

#include <iostream>

struct X {
  int a : 6 = 8;
  int b : 2 {1};
};

int main()
{
  X x;
  std::cout << x.a << std::endl;
  std::cout << x.b << std::endl;
}

出力

8
1

関連項目

参照