What is it, naokirin?

C++0xの機能 (一様な初期化構文)

今回は"Uniform initialization"(一様な初期化構文)。

初期化のときにどのようなオブジェクトにも次のような構文

struct SampleA
{
    int a;
    float b;
};

struct SampleB
{
    SampleB(int _a, float _b) : a(_a), b(_b) {}
 
private:
    int a;
    float b;
};

SampleA v = {1, 3.0f};
SampleB v = {2, 2.5f};


のような構文を用いて初期化を行うことができるようになります。

もともと、C++での初期化は構造体でのC言語の仕様である初期化リストによる初期化とC++コンストラクタ構文の関数による初期化が存在していました。C++0xでは、上のようにどのようなオブジェクトにも利用できる初期化構文が追加されます。

ただし注意したいのは、初期化リストのコンストラクタを持つようなクラスの初期化に上のような構文を用いると、初期化リストがコンストラクタのとる型と一致した場合はそちらが優先され、通常のコンストラクタが呼び出されない場合もあるということである。
例.

/* この場合、サイズを指定するコンストラクタではなく、
   初期化リストによるコンストラクタが呼ばれる */
std::vector<int> v = { 1 }