2012-02-06 25 views
13

Có một lý do nào đó unique_ptr::reset không có quá tải mất const deleter&deleter&& để phù hợp với các nhà thầu của nó mà lấy những đối số đó làm đối số thứ hai không?Tại sao không unique_ptr :: đặt lại có quá tải mà có một deleter?

Trình gỡ rối được lưu trữ trong unique_ptr sẽ được sao chép hoặc chuyển nhượng được gán với đối số từ reset. Nếu deleter là noncopyable hoặc nonmovable, gọi quá tải tương ứng của reset sẽ không biên dịch. Điều này có vẻ như nó sẽ là hành vi nhất quán với các nhà thầu.

Trả lời

24

Tôi nghĩ về việc thêm đó nhưng bạn có thể nhận được các chức năng tương đương với một toán tử gán di chuyển:

ptr = unique_ptr<T, D>(new T(another_value), D(another_state)); 

Vì vậy, tôi đã lựa chọn không nói điều tương tự với reset vì lợi ích của việc giữ API nhỏ vừa phải.

Cập nhật

Và tôi sống và học tập ...

Cú pháp thực sự có thể được đơn giản hơn nhiều so với những gì tôi thấy ở trên:

ptr = {new T(another_value), D(another_state)}; 
+3

+1 để có câu trả lời duy nhất _authoritative_ cho câu hỏi 'tại sao'. – ildjarn

+0

Nó sẽ không được sạch hơn và phù hợp hơn với shared_ptr nếu có một chức năng thiết lập lại? Đối với tôi, nó cảm thấy đặc biệt sạch hơn khi bạn có một chức năng tùy chỉnh deleter. Ví dụ: 'ptr = unique_ptr (new_raw_ptr, deleter_function);' vs 'ptr.reset (new_raw_ptr, deleter_function);'. Hoặc thậm chí tốt hơn nếu chúng ta có thể giữ cùng một deleter_function, vì vậy nó sẽ giống như: 'ptr.reset (new_raw_ptr);'. – felipou

+1

@felipou: Công trình thứ hai.Đối với các cựu, đây là cách * bạn * có thể làm cho nó xảy ra: http://cplusplus.github.io/LWG/lwg-active.html#submit_issue –

3

Vì thiết bị lưu trữ được lưu trữ trong đối tượng khi xây dựng. Vì kiểu deleter là một đối số mẫu, sau khi xây dựng, không có cách nào để "chuyển đổi" lớp để sử dụng một đối số khác.

+0

Vì vậy, gọi toán tử gán bản sao hoặc di chuyển toán tử gán tương ứng. Nếu deleter của bạn không có một truy cập chấp nhận được nó sẽ không biên dịch. – David

+0

Đó không phải là việc vượt qua một lớp học để phục vụ một mục đích đơn giản? –

+0

Bạn có thể sao chép cấu trúc và di chuyển cấu trúc - tại sao việc thêm khả năng sao chép chuyển nhượng và chuyển nhượng sẽ bị quá tải? Điều này có vẻ như mức độ phức tạp nhất quán với các chức năng khác đối với tôi (có nghĩa là, không phức tạp chút nào) – David

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