2013-03-13 10 views
6

C++ 11の構文に関する簡単な質問。 (sourceから1に減少)、サンプルコード、私が知りたいのです中カッコでctorを呼び出す

struct Wanderer 
{ 
    explicit Wanderer(std::vector<std::function<void (float)>> & update_loop) 
    { 
    update_loop.emplace_back([this](float dt) { update(dt); }); 
    } 
    void update(float dt); 
}; 

int main() 
{ 
    std::vector<std::function<void (float)>> update_loop; 
    Wanderer wanderer{update_loop}; // why {} ??? 
} 

があり、それはそれはどちらも初期化子リストであるWanderer wanderer{update_loop};ような中括弧で可能なコールコンストラクタ、また均一に初期化することができますどのように。これは何ですか?

+0

しかし、これは一様な初期化です。中カッコを使ってコンストラクタを呼び出すことができますが、その型の 'std :: initializer_list'を取っているコンストラクタが常に優先されます。 – chris

+0

'//なぜ{} ???' - 良い質問です。これは 'ワンダラーワンダラー(update_loop)'よりもこれを好む理由ではない。 – ipc

+1

@ipc場合によっては、最も厄介な解析を避けることができます。 – juanchopanza

答えて

13

イニシャライザリストでも、均一な初期化でもありません。これは何ですか?

あなたの前提が間違っています。統一された初期化であり、標準語では直接ブレースの初期化です。

std::initializer_listを受け入れるコンストラクタが存在しない限り、オブジェクトを構築するために中カッコを使用することは、カッコを使用することと同じです。

括弧を使用することの利点は、構文がMost Vexing Parse問題に免疫があるということです。

struct Y { }; 

struct X 
{ 
    X(Y) { } 
}; 

// ... 

X x1(Y()); // MVP: Declares a function called x1 which returns 
      // a value of type X and accepts a function that 
      // takes no argument and returns a value of type Y. 

X x2{Y()}; // OK, constructs an object of type X called x2 and 
      // provides a default-constructed temporary object 
      // of type Y in input to X's constructor. 
1

それはちょうどC++ 11構文です。コンストラクタを呼び出すオブジェクトを中括弧で初期化することができます。型にinitializer_listコンストラクタがある場合は、その型が優先されることに注意してください。