2012-01-14 41 views
12

A std::array<T> về bản chất là một mảng kiểu C được bao bọc trong một struct. Việc khởi tạo struct s đòi hỏi niềng răng, và khởi tạo các mảng đòi hỏi niềng răng là tốt. Vì vậy, tôi cần hai cặp niềng răng:std :: mảng <T> khởi tạo

std::array<int, 5> a = {{1, 2, 3, 4, 5}}; 

Nhưng hầu hết các mã ví dụ tôi đã thấy chỉ sử dụng một cặp niềng răng:

std::array<int, 5> b = {1, 2, 3, 4, 5}; 

Tại sao điều này được cho phép, và nó có bất kỳ lợi ích hoặc hạn chế so với lần chấp thuận đầu tiên?

+0

Tôi không chắc nó _is_ cho phép theo tiêu chuẩn - có thể là trình biên dịch mà chấp nhận mã mà được dựa trên một C trướC++ 11 dự thảo, hoặc đơn giản là đưa ra một cảnh báo vì nó là phần mở rộng cho phép mã hình thành không đúng. – ildjarn

+0

@ildjarn Theo Johannes, nó được cho phép. – fredoverflow

Trả lời

14

Lợi ích là bạn có ... ít hơn để nhập. Nhưng nhược điểm là bạn chỉ được phép rời khỏi niềng răng khi tờ khai có dạng đó. Nếu bạn rời khỏi số = hoặc nếu mảng là thành viên và bạn khởi tạo nó với member{{1, 2, 3, 4, 5}}, bạn không thể vượt qua một cặp niềng răng.

Điều này là do có những lo ngại về tình trạng quá tải có thể xảy ra khi niềng răng được chuyển đến các chức năng, như trong f({{1, 2, 3, 4, 5}}). Nhưng nó gây ra một số cuộc thảo luận và một báo cáo vấn đề đã được tạo ra.

Về cơ bản, = { ... } khởi luôn luôn đã có thể bỏ qua niềng răng, như trong

int a[][2] = { 1, 2, 3, 4 }; 

Đó không phải là mới. Có gì là mới là bạn có thể bỏ qua các =, nhưng sau đó bạn phải xác định tất cả niềng răng

int a[][2]{ {1, 2}, {3, 4} }; 
+0

Bạn có thể cung cấp một báo giá chuẩn để biện minh cho việc chỉ có một cặp mắc cài không? – fredoverflow

+1

http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1270 –

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