2013-03-13 29 views
6

Câu hỏi đơn giản về cú pháp C++ 11. Có một mã mẫu (giảm một từ source)Gọi ctor với niềng răng

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

Tôi muốn biết, làm thế nào nó có thể được có thể xây dựng cuộc gọi với dấu ngoặc nhọn như Wanderer wanderer{update_loop}; Nó không phải là danh sách initializer, cũng không phải khởi tạo thống nhất. Có chuyện gì vậy?

+0

Nhưng đó là khởi tạo đồng bộ. Niềng răng có thể được sử dụng để gọi các hàm tạo, mặc dù hàm tạo sử dụng 'std :: initializer_list' của kiểu đó luôn được ưa thích. – chris

+0

'// why {} ???' - Câu hỏi hay. Không có lý do gì để thích nó hơn 'Wanderer wanderer (update_loop)'. – ipc

+1

@ipc Trong một số trường hợp, nó có thể tránh được phân tích cú pháp khó chịu nhất. – juanchopanza

Trả lời

13

Đây không phải là danh sách bộ khởi tạo, cũng không khởi tạo đồng bộ. Có chuyện gì vậy?

Tiền đề của bạn sai. Đó là khởi tạo đồng bộ và, trong các thuật ngữ chuẩn, khởi tạo cú đúp trực tiếp.

Trừ khi một nhà xây dựng chấp nhận một std::initializer_list là hiện tại, sử dụng niềng răng để xây dựng các đối tượng tương đương với việc sử dụng dấu ngoặc đơn.

Ưu điểm của việc sử dụng dấu ngoặc là cú pháp là miễn dịch với các vấn đề 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

Nó chỉ C++ 11 Cú pháp là. Bạn có thể khởi tạo các đối tượng gọi hàm tạo của chúng với các dấu ngoặc nhọn. Bạn chỉ cần nhớ rằng nếu kiểu có một hàm khởi tạo initializer_list, thì nó sẽ được ưu tiên.

Các vấn đề liên quan