2013-03-13 83 views
6

關於C++ 11語法的簡單問題。有一個示例代碼(從source減少一個)用大括號調用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 2013-03-13 20:47:59

+0

'//爲什麼{} ???' - 好問題。沒有理由比'Wanderer流浪者(update_loop)'更喜歡這個。 – ipc 2013-03-13 20:50:42

+1

@ipc在某些情況下,它可以避免最令人頭疼的解析。 – juanchopanza 2013-03-13 20:51:33

回答

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構造函數,那麼這個構造函數優先。