- 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