2013-09-07 80 views
13

Tại sao không C++ cho phép các vùng chứa không hoàn chỉnh được khởi tạo?Tại sao các vùng chứa C++ không cho phép các loại không đầy đủ?

Chắc chắn có thể để viết vùng chứa không bị hạn chế này - boost::container hoàn toàn có khả năng thực hiện việc này. Theo như tôi có thể thấy, nó dường như không cho bất kỳ hiệu suất hay loại lợi ích nào khác, và tiêu chuẩn tuyên bố nó là hành vi không xác định.

Ví dụ: không ngăn cấu trúc dữ liệu đệ quy được xây dựng.

Tại sao tiêu chuẩn C++ áp đặt giới hạn tùy ý này? Điều gì sẽ là nhược điểm của việc cho phép các loại không hoàn chỉnh như các tham số mẫu ở bất cứ nơi nào có thể?

+8

Vì thùng chứa, trừ khi chúng lưu trữ con trỏ, cần kích thước của loại đối tượng mà cửa hàng lưu trữ? –

+1

Tại sao bạn nghĩ rằng họ không? Tôi không thể tìm thấy bất kỳ hạn chế nào như vậy trong tiêu chuẩn C++ 11. –

+2

@ViktorSehr: Tất cả các vùng chứa tiêu chuẩn ngoại trừ 'mảng' * làm * (con trỏ lưu trữ trực tiếp), không phải đối tượng; do đó, họ không cần loại cần hoàn thành cho đến khi cần phân bổ một hoặc nhiều đối tượng. –

Trả lời

15

Matt Austern, chủ tịch của tổ công tác thư viện C++ ủy ban tiêu chuẩn hóa của, giải thích quyết định này của ủy ban trong Dr. Dobb's article của mình bằng lý do lịch sử:

Chúng tôi phát hiện ra, với thử nghiệm nhiều hơn, mà ngay cả những [đơn giản] ví dụ đã không làm việc với mọi thực thi STL. Cuối cùng, tất cả dường như quá u ám và quá kém hiểu; Ủy ban tiêu chuẩn hóa không nghĩ rằng có bất kỳ sự lựa chọn nào ngoại trừ việc nói rằng các container STL không được phép làm việc với các kiểu không đầy đủ. Để có biện pháp tốt, chúng tôi đã áp dụng việc cấm phần còn lại của thư viện chuẩn.

Sự hiểu biết của tôi về điều này là ủy ban không muốn vô hiệu hóa các triển khai hiện tại của thư viện bằng cách yêu cầu họ hỗ trợ các loại chưa hoàn chỉnh trở về trước.

Trong cùng một bài viết ông thừa nhận rằng

Trong một phiên bản tương lai của C++, nó có thể làm cho tinh thần để thư giãn các hạn chế về instantiating mẫu thư viện tiêu chuẩn với loại không đầy đủ.

Cho rằng bài viết có từ năm 2002 và lệnh cấm vẫn giữ nguyên trong tiêu chuẩn hiện tại, tôi nghĩ rằng quyết định của các nhà thiết kế không chờ đợi trong tương lai và xây dựng các thùng chứa riêng của họ hoàn toàn hợp lý.

+1

Bài viết của Tiến sĩ Dobbs khá lạc hậu. Boost đã thực hiện nó ngay bây giờ, và nó rõ ràng là có thể. Câu cuối cùng của bạn có ý nghĩa gì đó nhưng bài viết của Tiến sĩ Dobbs không ... – Mehrdad

+2

@ Ủy ban tiêu chuẩn (như hầu hết các ủy ban) rất chậm trong việc ra quyết định. Đôi khi, đó là một điều tốt; đôi khi (như tôi nghĩ là trường hợp với thư viện chuẩn của C++) nó quá hạn chế. Tuổi của bài viết này là một bằng chứng tốt: hạn chế này đã được nâng lên trong một thời gian dài, ít nhất là trên 'std :: vector '. – dasblinkenlight

+1

Tôi thành thật không nghĩ rằng họ đã "chậm" ... và ý tưởng rằng họ sẽ không muốn yêu cầu thư viện để hỗ trợ này hồi tố là lạ. Đó là một tiêu chuẩn C++ mới sau khi tất cả - có rất nhiều thay đổi phức tạp hơn để thêm; lợi ích của việc không thêm điều này là gì? – Mehrdad