Tôi muốn viết loại vùng chứa. Vùng chứa này có phương thức chèn có hai chuyên môn - đầu tiên sử dụng các nhà xây dựng sao chép để sao chép dữ liệu từ một vùng chứa đến một phần tử vùng chứa khác một cách khôn ngoan. Nếu nhà xây dựng bản sao ném ngoại lệ, tôi chỉ hoàn tác mọi thay đổi đối với vùng chứa như không có gì xảy ra.Mã an toàn ngoại lệ và di chuyển ngữ nghĩa
Chuyên môn thứ hai sử dụng hàm tạo di chuyển và đó là nơi mọi thứ trở nên phức tạp. Khi tôi di chuyển các mục từ một thùng chứa đến một phần tử vùng chứa khác theo phần tử, di chuyển hàm tạo có thể ném ngoại lệ. Nếu điều này xảy ra - Tôi đã thực sự lộn xộn khi một số yếu tố được di chuyển và các yếu tố khác vẫn ở trong những nơi ban đầu. Nếu tôi cố gắng di chuyển các phần tử trở lại - tôi có thể có ngoại lệ khác.
Có thể viết một cái gì đó như thế này trong cách ngoại lệ an toàn hoặc ngoại lệ an toàn và di chuyển ngữ nghĩa là loại trừ lẫn nhau?
Tôi không nhận được "PS". Bạn có thể xây dựng? –
Nếu di chuyển của bạn có thể ném, std :: move_if_noexcept fallbacks để sao chép. NHƯNG! nếu công cụ của bạn không có một hàm tạo bản sao, std :: move_if_noexcept nói 'Meh' và di chuyển nó (những gì khác nó có thể làm thực sự?), có thể nhận được một ngoại lệ và để lại container của bạn trong trạng thái thực sự xấu. –
Một lựa chọn khủng khiếp để xác định nó theo cách IMO ... bạn có thể tạo phiên bản của riêng bạn (không có '&& std :: is_copy_constructible :: value') sẽ gây ra lỗi thời gian biên dịch thay thế. –
Joe