2012-01-20 31 views
23

Tại sao đối số mặc định bị xóa theo tiêu chuẩn mới? Thường thì tôi xây dựng một biến vector như thế này: std::vector<my_pod_struct> buf(100). Tôi đoán tôi sẽ nhận được một lỗi trình biên dịch với một trình biên dịch C + + 11.Tại sao giao diện constructor của std :: vector thay đổi với C++ 11?

explicit vector(size_type count, 
       const T& value = T(),     /* until C++11 */ 
       const Allocator& alloc = Allocator()); 
     vector(size_type count, 
       const T& value,       /* since C++11 */ 
       const Allocator& alloc = Allocator()); 
+7

Bạn đã bỏ lỡ các nhà xây dựng mới 'rõ ràng vector (count size_type);'? –

+0

Có bạn đúng, xin lỗi! –

Trả lời

50

Trước đây, khi bạn đã viết std::vector<T> buf(100); bạn sẽ nhận được một T mặc định được xây dựng, và sau đó dụ đó sẽ được sao chép sang một trăm khe trong vector.

Bây giờ, khi bạn viết std::vector<T> buf(100);, nó sẽ sử dụng một hàm tạo khác: explicit vector(size_type count);. Điều này sẽ mặc định xây dựng một trăm T s. Đó là một sự khác biệt nhỏ, nhưng một điều quan trọng.

Trình tạo đối số đơn mới không yêu cầu loại T để có thể sao chép được. Điều này là quan trọng bởi vì bây giờ các loại có thể di chuyển và không thể sao chép được.

+0

Đây là một câu trả lời tuyệt vời. –

+3

+1 khi thiết kế các thuật toán chung, thật dễ dàng để cho một số yêu cầu bổ sung lẻn vào và thậm chí không nhận ra nó. Các CopyConstructible ở đây là một ví dụ hoàn hảo của một cái gì đó không rõ ràng như vậy trong nháy mắt đầu tiên. –

+2

@MatthieuM. Đó là lý do tại sao chúng tôi muốn các khái niệm! ;) –

3

Bạn sẽ không, hiện nay có nhà xây dựng riêng cho trường hợp sử dụng của bạn:

explicit vector(size_type n); 
Các vấn đề liên quan