2012-02-12 25 views
13

Tôi đã đọc một số bài viết mâu thuẫn liên quan đến việc chuyển các nhà thầu/nhiệm vụ được phép ném hay không.Các nhà thầu di chuyển có được yêu cầu không được chấp nhận không?

Vì vậy, tôi muốn hỏi liệu các nhà thầu/nhiệm vụ di chuyển có được phép ném vào tiêu chuẩn C++ 11 cuối cùng không?

+0

Tôi không thấy gì trong tiêu chuẩn về việc di chuyển các nhà thầu không được phép ném, nhưng tôi đã thấy rằng "Trình xây dựng di chuyển được khai báo ngầm cho lớp X sẽ có dạng ' X :: X (X &&) ' ", và tôi không thấy 'noexcept' trong đó. –

+0

Trong bản nháp cuối cùng, tôi không thấy 'noexcept' được khai báo cho bất kỳ chức năng nào ... – ronag

+0

@ronag: Bạn có chắc chắn bạn đang tìm kiếm không? Bởi vì tôi đã mở N3337 và chỉ tìm kiếm "' noexcept' "và ngay lập tức có chức năng' swap' của lớp nào đó. –

Trả lời

17

Các nhà thầu di chuyển nói chung có được phép ném không? Vâng. Có nên không? Số

Nói chung, không có gì bạn làm trong đó phải là bất cứ thứ gì có thể ném. Bạn không nên cấp phát bộ nhớ, gọi mã khác hoặc bất kỳ thứ gì như thế. Lý do duy nhất để viết một hàm tạo di chuyển là bỏ qua con trỏ bộ nhớ của người khác và tham chiếu đối tượng. Bạn nên sao chép một vài loại cơ bản và vô hiệu hóa các giá trị trong đối tượng khác. Những thứ đó không nên ném.

Vì vậy, trong khi nó được cho phép, nó không phải là một ý tưởng tốt. Nếu bạn đang làm điều đó, hãy suy nghĩ lại những gì bạn đang làm trong các hoạt động di chuyển của bạn.

+0

Tôi giả sử không có loại stl ném trong constructor di chuyển? Những nơi duy nhất tôi nên lo lắng về nó là với USD? – ronag

+6

@ronag: Nếu std :: type không có 'noexcept' trên hàm khởi tạo, nó được phép ném. Cụ thể, một số việc triển khai các thùng chứa dựa trên nút có một hàm tạo chuyển động ném vì mỗi vùng chứa phải chứa một nút cuối được phân bổ heap, thậm chí là các thùng chứa rỗng. Các triển khai khác của các thùng chứa tương tự này không có thiết kế này và do đó có thể (và được phép) có một hàm tạo di chuyển không được chấp nhận. –

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