2011-09-12 38 views
7

Từ bản sửa đổi đọc N3242 của bản thảo C++ 11, có vẻ như một số thành phần của giao diện của thư viện chuẩn (đặc biệt là luồng và khóa) phụ thuộc vào xử lý ngoại lệ.Có danh sách các giao diện thư viện chuẩn C++ 11 yêu cầu bật ngoại lệ không?

Vì tôi thực hiện rất nhiều công việc với ngoại lệ bị vô hiệu hóa, tôi tự hỏi thành phần/tính năng thư viện nào (thực tế hoặc logic) không sử dụng được nếu không có xử lý ngoại lệ?

+0

Thực tế, tất cả các tính năng đều có thể sử dụng được, cho đến khi ngoại lệ thực sự được ném. Sau đó, chương trình của bạn bị treo. Nếu chức năng thư viện có thể ném, điều này được quy định trong tiêu chuẩn, do đó, theo cách có danh sách - bản thân tiêu chuẩn. –

+0

@ n.m. có vẻ như bạn có thể đã đọc bài đăng của tôi bằng cách sử dụng định nghĩa sai về 'thực tế': http://dictionary.reference.com/browse/practically. nếu không, có sự khác biệt về độ phức tạp và địa phương của những thứ như 'std :: vector.at (size_t)' so với luồng và khóa của chương trình/môi trường. đã triển khai các thư viện luồng và khóa, tôi có thể cho bạn biết rằng bạn có thể bảo vệ bản thân trước các thư viện dễ dàng và dễ đoán trước. (cont) – justin

+0

(tiếp) bảo vệ chính mình sau này phức tạp hơn nhiều. khi mọi thứ đi sai, một ngoại lệ không được giải quyết không phải là một giải pháp (đối với một số người trong chúng ta). tôi không thể bỏ qua những lỗi này :) do đó, tôi không thể dựa vào việc triển khai luồng và khóa của thư viện vì sự phòng thủ duy nhất được cung cấp bởi thư viện là ngoại lệ. trong kết luận, các giao diện luồng và khóa không phù hợp cho các chương trình mà các ngoại lệ bị vô hiệu hóa. hy vọng rằng sẽ giúp. – justin

Trả lời

1

Câu hỏi này đã quá một tháng và chưa được trả lời.

Tôi đang cung cấp câu trả lời có thể được coi là một wiki cộng đồng, thêm vào đó nếu cần.

  • std::threadMục 30.2.2. Bắc cầu. Tóm tắt được triển khai bằng cách sử dụng các triển khai gốc.

  • std::mutex, std::recursive_mutex, std::timed_mutex, std::recursive_timed_mutex. Mục 30.4.1, Không liên quan nếu bạn cung cấp khóa ngoại lệ miễn phí của riêng mình (qua BasicLockable, Lockable, TimedLockable). Tóm tắt được triển khai bằng cách sử dụng các triển khai gốc.

  • std::condition_variableMục 30.5. Bắc cầu. Tóm tắt được triển khai bằng cách sử dụng các triển khai gốc.

lưu ý: Sẽ có nhiều hơn.

4

Trước hết (như lời nhắc), vô hiệu hóa ngoại lệ và RTTI là các phần mở rộng cụ thể của trình biên dịch mà Standard không cân nhắc.

Kể từ bộ thư viện chuẩn thường được gắn liền với trình biên dịch, nó thể thể là thực hiện của bạn bộ thư viện chuẩn đã được thiết kế đặc biệt để đối phó với điều này (và đặc biệt là để đối phó với new trở về con trỏ null thay vì nâng cao std::bad_alloc).

Vì vậy, những gì bạn yêu cầu là không hợp lý. Kiểm tra tài liệu của thư viện của riêng bạn để biết danh sách đầy đủ.

Điều đó đang được nói, tiêu chuẩn không đảm bảo rằng một số thao tác sẽ không bao giờ bị ném. Tôi không biết về bất kỳ hoạt động nào nuốt các ngoại lệ, tôi cho rằng hầu hết chúng đều an toàn khi sử dụng.

Ví dụ: tất cả các thuật toán phải an toàn.

Tuy nhiên, một lần nữa, tôi chỉ có thể khuyên bạn nên đọc tài liệu của triển khai của bạn.

+0

có các biến thể 'mới' phổ biến với mục đích tránh' bad_alloc'. 'nothrow_t' là dạng được xây dựng trong thư viện cung cấp, những người khác (bao gồm cả các trình phân bổ người dùng định nghĩa) có thể được người dùng định nghĩa thông qua vị trí mới. cho các bộ sưu tập, người ta có thể chỉ định một cấp phát không ném: 'std :: vector >' và sau đó giao diện của vector có thể sử dụng được với điều kiện bạn tuân thủ các quy tắc. (cont) – justin

+0

(tiếp theo) có các chương trình C++ chất lượng cao phức tạp mà không phụ thuộc vào ngoại lệ. bài viết của bạn không có thành tích (+1), nhưng tôi nghĩ một số khái quát * có thể được tạo trong trường hợp này - một lần nữa, ví dụ về luồng của tôi (không an toàn), khóa (không an toàn) và giờ đây vector (giao diện có thể được sử dụng an toàn nếu không ai sống phụ thuộc vào nó). – justin

+0

@Justin: Tôi không nói điều đó là không thể, tôi chỉ nói nó không phải là Tiêu chuẩn. Ví dụ, mặc dù 'new (nothrow_t)' tồn tại, một 'vector' có thể không sử dụng nó. Bây giờ, tôi biết rằng một số thư viện biên dịch mà không có ngoại lệ, LLVM/Clang là một trong số họ ví dụ. Tuy nhiên họ đã định nghĩa lại hầu hết các lớp tiện ích. –

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