2015-03-27 10 views
8

C++ 11 (và C++ 14) STL container có noexcept destructors và clear() chức năng thành viên.Các phần tử chứa STL có được yêu cầu rõ ràng là không thể loại bỏ được không?

Điều này ngụ ý rằng các phần tử cũng cần phải có noexcept destructors hoặc ít nhất là các phần tử thực được lưu trữ trong vùng chứa không được ném bất kỳ ngoại lệ nào khi bị hủy - hoặc chính xác hơn là cuộc gọi allocator_traits<Allocator>::destroy tương ứng không được ném.

Đây có phải là quy định như một yêu cầu (một cách rõ ràng hay ngụ ý bởi một yêu cầu rõ ràng) bất cứ nơi nào trong tiêu chuẩn? Nếu không, tại sao?

Tôi biết is_nothrow_constructible yêu cầu một số noexcept destructor, nhưng chỉ riêng is_constructible và yêu cầu vùng chứa được chỉ định theo khái niệm thay vì nhập mẫu đặc điểm.

+0

Trình phá hủy vùng chứa có thể bắt và bỏ qua bất kỳ ngoại lệ nào từ (các) trình phá hủy của phần tử. –

Trả lời

7

17.6.4.8/1 Trong những trường hợp nhất định (chức năng thay thế, chức năng xử lý, hoạt động trên các loại sử dụng để nhanh chóng chuẩn thành phần thư viện mẫu), cáC++ thư viện chuẩn C phụ thuộc vào thành phần được cung cấp bởi một chương trình C++. Nếu các thành phần này không đáp ứng các yêu cầu của chúng, Tiêu chuẩn đặt không yêu cầu thực hiện .

17.6.4.8/2 Đặc biệt, hiệu ứng được định nghĩa trong các trường hợp sau:

...

  • nếu có chức năng thay thế hoặc chức năng xử lý hoặc hoạt động destructor thoát qua một ngoại lệ , trừ khi được cho phép cụ thể trong áp dụng Hành vi bắt buộc: đoạn.
+0

Hm… Tôi vừa mới nhận ra: cần có một yêu cầu tương tự đối với người phân bổ do người dùng cung cấp, đúng không? Có tồn tại không? –

+0

Trong ** 17.6.3.5 ** bảng 28, một mục nhập cho 'allocate' nói" 'allocate' có thể tăng một ngoại lệ thích hợp."; mục nhập cho 'deallocate' nói" Không ném ngoại lệ ". Đây có phải là những gì bạn đang yêu cầu? –

+0

Ah, đúng vậy! Vâng, đó là chính xác những gì tôi có nghĩa là, cảm ơn. Vì một lý do nào đó, tôi không tìm thấy bảng đó trong phần đó. –

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