2013-08-09 37 views
11

std::array trong C++ 11 là một lớp hữu ích cung cấp giao diện C++ Container trên một mảng ngăn xếp C.Thiết kế quyết định liên quan đến std :: mảng điền

Nhưng tại sao std::array không có hàm tạo điền điển hình mà hầu hết các vùng chứa đều có? Thay vào đó, nó có một phương thức fill.

Có một số lý do tại sao std::array là duy nhất trong số các vùng chứa STL trong lĩnh vực này không?

+5

Bởi vì nếu không thì std :: mảng sẽ không còn là POD nữa. –

+0

Tôi nghĩ C++ 11 thoải mái định nghĩa của POD – Channel72

+7

@ Kênh72: POD: * "Cấu trúc POD là một lớp phi công đoàn là cả lớp __trivial class__ và lớp bố cục chuẩn [...]" *. lớp tầm thường: * "Một lớp tầm thường là một lớp có hàm tạo mặc định (12.1), không có hàm tạo mặc định __non-tầm thường__ và có thể sao chép được một cách trivially." * Tuy nhiên, 'std :: array' là tổng hợp và tuân theo các quy tắc tương tự (xem câu trả lời của Borgleader). – Zeta

Trả lời

5

Có; std::array có nghĩa là tổng hợp (C++ 11 §8.5.1) sao cho có thể được sử dụng trong nhiều ngữ cảnh nhất có thể khi sử dụng mảng đồng bằng. Tổng hợp có thể không có các hàm tạo hoặc hàm hủy rõ ràng.

6

Từ phần 23.3.2.1:

Một mảng là một tổng hợp (8.5.1) có thể được khởi tạo với cú pháp mảng a = {initializer-list};

Nếu nó hoạt động như std::vector, nó sẽ không còn là POD nữa. Ngoài ra từ cùng một phần:

Phải đáp ứng các điều kiện cho tổng hợp (8.5.1).

Những điều kiện này là:

Một tổng hợp là một mảng hoặc một lớp học (khoản 9) không có nhà xây dựng người dùng cung cấp (12.1), không có cú đúp-hoặc-equalinitializers cho dữ liệu không tĩnh thành viên (9.2), không có thành viên dữ liệu không được bảo mật hoặc riêng tư (khoản 11), không có lớp cơ sở (Điều 10) và không có chức năng ảo (10.3).

3

Mọi nhân giải thích "tại sao" khá tốt tôi nghĩ, vì vậy tôi sẽ chỉ đưa ra một gợi ý cách giải quyết, mà phải biên dịch là tốt như một constructor mẹ đẻ:

template< typename T, std::size_t n > std::array<T,n> filledArray(const T& v) { 
    std::array<T,n> r; 
    r.fill(v); 
    return r; 
} 

auto arr = filledArray<int,4>(7); 
+0

Hm, bất kỳ lý do nào để không sử dụng vòng lặp for-range? Chỉ tò mò thôi. – Zeta

+0

Hoặc chức năng thành viên 'fill'? –

+0

@BenjaminLindley điểm tốt! – Dave

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