メンバ初期化拡張


概要

C++11にてメンバ変数に対するデフォルト初期化の機能が追加された。しかし、この機能は集約型(Aggregate)に対しては許可されていなかった。 そもそも、C++11時点での集約型の要件は以下の様になっていた。

  • 配列である、もしくはユーザ定義のコンストラクタを持たないクラスである
  • 非staticメンバ変数が宣言時に初期化式を持たない。
  • private, protectedの非staticメンバ変数を持たない
  • ベースクラスを持たない
  • virtual関数を持たない

この要件を満たす場合、集約型として扱われる。 したがって、メンバ変数のデフォルト初期化を行う時点で集約型ではなくなる。

C++14では、「非staticメンバ変数が宣言時の初期化式を持たない」という制約は不便であるとして、制約が緩和された。 これにより、以下のようなコードが利用可能となる。

struct X {
    char c;
    int i;
    long l = 5L;
};

int main() {
    X x[] = { {'a', 10}, {'b', 10, 100L}, {'c', 20} };
    X y[] = { 'a', 10, 5L, 'b', 10, 100L, 'c', 20, 5L };
    X z[] = { 'a', 10, 5L, 'b', 10, 100L, 'c', 20 };

    return 0;
}

集約型の配列の初期化を行う際に、{}のネストを省略可能となっている。 省略して記述した場合、指定した順に評価され、デフォルト値を持つメンバ変数も指定した値で初期化される。 値が指定されないパラメータは、デフォルト値で初期化されるか、T{}で初期化したものとして扱われる。(T=任意の型) 上記の例では、x, y, zは同じ値を持つ。

results matching ""

    No results matching ""