- Auto_ptr sẽ không được chấp nhận trong tiêu chuẩn C ++ sắp tới?
- Có nên sử dụng unique_ptr để chuyển quyền sở hữu thay vì shared_ptr không?
- Nếu unique_ptr không có trong tiêu chuẩn, thì tôi có cần sử dụng shared_ptr thay thế không?
Câu trả lời:
CẬP NHẬT: Câu trả lời này được viết vào năm 2010 và như dự đoán std::auto_ptr
đã không được dùng nữa. Lời khuyên là hoàn toàn hợp lệ.
Trong C ++, 0x std::auto_ptr
sẽ không được dùng nữa std::unique_ptr
. Việc lựa chọn con trỏ thông minh sẽ tùy thuộc vào trường hợp sử dụng và yêu cầu của bạn, với std::unique_ptr
ngữ nghĩa di chuyển cho quyền sở hữu duy nhất có thể được sử dụng bên trong các vùng chứa (sử dụng ngữ nghĩa di chuyển) và std::shared_ptr
khi quyền sở hữu được chia sẻ.
Bạn nên cố gắng sử dụng con trỏ thông minh phù hợp nhất với tình huống, việc chọn đúng loại con trỏ sẽ cung cấp cho các lập trình viên khác cái nhìn sâu sắc về thiết kế của bạn.
Có, kể từ hôm nay auto_ptr
sẽ không được dùng trong C ++ 0x và bạn nên sử dụng unique_ptr
thay thế. Từ tiêu chuẩn dự thảo mới nhất (n3035), phần D.9
Mẫu lớp
auto_ptr
không được dùng nữa. [Lưu ý: Mẫu lớpunique_ptr
(20.9.10) cung cấp giải pháp tốt hơn. —Gửi ghi chú]
Cho đến khi tiêu chuẩn được phê chuẩn, luôn có khả năng ủy ban sẽ sửa đổi quyết định này mặc dù tôi cảm thấy điều đó khó xảy ra với quyết định này.
Không chỉ auto_ptr
không được chấp nhận trong C ++ 11 (D.10, trang 1228) , nó cũng sẽ bị xóa trong phiên bản tương lai của C ++ :
Thông qua N4190, và thực sự loại bỏ (không chỉ bị phản đối) một vài điều cổ xưa từ Thư viện C ++ chuẩn, bao gồm
auto_ptr
,bind1st
/bind2nd
,ptr_fun
/mem_fun
/mem_fun_ref
,random_shuffle
và một vài chi tiết. Tất cả chúng hiện đã bị xóa khỏi thư viện chuẩn C ++ 17 nháp và sẽ không phải là một phần của C ++ di động trong tương lai.
Một tài liệu khác về nó: Ngôn ngữ lập trình C ++, Nhóm công tác phát triển thư viện - Tài liệu N4190 , nếu bạn muốn biết thêm thông tin.
Bạn có thể chuyển đổi bất kỳ mã nào bằng auto_ptr
automaticaly, bằng cách sử dụng unique_ptr
:
Bất kỳ mã nào đang sử dụng
auto_ptr
đều có thể được chuyển đổi cơ học sang sử dụngunique_ptr
, với việcmove()
chèn vào bất cứ khi nàoauto_ptr
được "sao chép".
Không, nó không bị phản đối. Có thể là như vậy, nếu C ++ 0x được chấp nhận. Và nó thực tế sẽ luôn được hỗ trợ. Tôi không tin rằng bất kỳ tính năng không dùng nữa đã từng bị loại bỏ khỏi triển khai C ++ trong thế giới thực.
auto_ptr
là một phần của tiêu chuẩn, nhưng được sử dụng ít hơn đáng kể. Từ quan điểm thực tế, việc loại bỏ nó sẽ ít tác động hơn.
<iostream.h>
hơn bao giờ hếtauto_ptr
, nhưng MS VC ++ (cho một) không cung cấp nó nữa.