2013-03-13 12 views
6

Proste pytanie o składnię C++ 11. Jest to przykładowy kod (zmniejszony jeden z source)Wywołanie ctor z nawiasami klamrowymi

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 {} ??? 
} 

Chciałbym wiedzieć, jak to może być możliwe wywołanie konstruktora z nawiasów klamrowych jak Wanderer wanderer{update_loop}; To nie lista inicjator, ani jednolita inicjalizacji. Co to jest?

+0

Ale jest to jednolita inicjalizacja. Klamrami można używać do wywoływania konstruktorów, ale zawsze preferowany jest konstruktor używający 'std :: initializer_list' tego typu. – chris

+0

'// dlaczego {} ???' - Dobre pytanie. Nie ma powodu, aby preferować to ponad "wędrowiec wędrowiec (update_loop)". – ipc

+1

@ipc W niektórych przypadkach może uniknąć najbardziej irytującej analizy. – juanchopanza

Odpowiedz

13

Nie jest to lista inicjalizatorów ani jednorodna inicjalizacja. Co to jest?

Twoje założenie jest błędne. Jest to jednolita inicjalizacja i, w terminologii standardowej, bezpośrednia inicjacja nawiasów klamrowych.

Jeśli nie ma konstruktora akceptującego std::initializer_list, użycie nawiasów klamrowych do konstruowania obiektów jest równoważne użyciu nawiasów.

Zaletą korzystania szelki to, że składnia jest odporny na problem 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

To jest po prostu C++ 11 składnia. Można inicjować obiekty wywołujące ich konstruktory za pomocą nawiasów klamrowych. Musisz tylko pamiętać, że jeśli typ ma konstruktor initializer_list, to ma pierwszeństwo.

Powiązane problemy