C++0x - 初期化子リスト(Initializer List)

C++0xでは、ユーザー定義クラスで配列のような初期化ができるようになります

vector<int> v = {3, 1, 4};

Bjarne氏曰く「なんで今までできなかったのかわからない」



戻り値に初期化子リスト

vector<int> create_vector()
{
    return {3, 1, 4};
}


引数に初期化子リスト

void something(const vector<int>& v)
{
    ...
}


something( {3, 1, 4} );


mapの要素

map<string, int> dict = { {"Akira", 22}, {"Johnny", 38}, {"Millia", 16} };


初期化子リストをユーザー定義クラスで使用するには
std::initializer_listを受け取るコンストラクタ(や代入演算子)を用意します。

template <class T>
class vector {
public:
    vector(std::initializer_list<T>);
};


initializer_listは以下のように定義されています

template <class T>
class initializer_list {
public:
    size_t size() const;
    const T* begin() const;
    const T* end() const;
};

ちなみに現在のC++の仕様でも、boost::arrayのようなクラスでは上記のような初期化ができます

template <class T, size_t N>
struct array {
    // publicなメンバ
    T element_[N];

    // ※デフォルトコンストラクタをあえて作らない
};
array<int, 3> ar = { 3, 1, 4};


また、initializer_listにともなう言語拡張 Uniform initialization によって
配列メンバ変数を初期化子リストで初期化できるようになります。

class hoge {
    int ar_[3];
public:
    hoge()
        : ar_{3, 1, 4}
    {
    }
};

C++0x言語拡張まとめ