Auto_ptr không được dùng nữa?


81
  1. Auto_ptr sẽ không được chấp nhận trong tiêu chuẩn C ++ sắp tới?
  2. Có nên sử dụng unique_ptr để chuyển quyền sở hữu thay vì shared_ptr không?
  3. 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:


77

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_ptrsẽ 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_ptrngữ 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_ptrkhi 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.


22

Có, kể từ hôm nay auto_ptrsẽ không được dùng trong C ++ 0x và bạn nên sử dụng unique_ptrthay thế. Từ tiêu chuẩn dự thảo mới nhất (n3035), phần D.9

Mẫu lớp auto_ptrkhông được dùng nữa. [Lưu ý: Mẫu lớp unique_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.


17

Không chỉ auto_ptrkhô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_shufflevà 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_ptrautomaticaly, 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ụng unique_ptr, với việc move()chèn vào bất cứ khi nào auto_ptrđược "sao chép".


3

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.


5
Tiêu chuẩn C ++ mới chỉ được cập nhật một lần và về cơ bản đó chỉ là một phiên bản kỹ thuật (tức là đã được khắc phục cho các vấn đề đã được trích dẫn). Không có gì ngạc nhiên khi nó không loại bỏ bất cứ thứ gì. OTOH, các tính năng cũ cuối cùng sẽ bị loại bỏ khỏi trình biên dịch. Ví dụ: có lẽ nhiều C ++ được sử dụng <iostream.h>hơn bao giờ hết auto_ptr, nhưng MS VC ++ (cho một) không cung cấp nó nữa.
Jerry Coffin

1
@Jerry iostream.h chưa bao giờ là một phần của bất kỳ tiêu chuẩn nào. Và như vậy, nó không bị phản đối.

@Neil: Không, nhưng nó đã được sử dụng rất nhiều . auto_ptrlà 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.
Jerry Coffin

2
@Jerry tốt, tôi sử dụng auto_ptr rất nhiều, và không sử dụng iostream.h cả. Đôi khi tôi nghĩ rằng comitee tiêu chuẩn C ++ có một chút khó khăn trong ca khúc tập thể của họ khi nói đến việc không dùng nữa. Một số điều, chẳng hạn như các luồng chuỗi ban đầu rõ ràng là sai, nhưng những thứ khác lại thích ý tưởng sử dụng không gian tên không tên thay vì từ khóa "tĩnh" hoàn toàn có thể sử dụng được (và đang) hoàn toàn sai lầm.

1
@Neil: Chà, chúng ta hãy thử đặt nó vào quan điểm. Bất kể cá nhân tôi làm gì, hãy cân nhắc rằng tìm kiếm trên google cho "<iostream.h>" mang lại ~ 263'000 lần truy cập và thực hiện tương tự với auto_ptr cho ~ 66'000 lần truy cập.
Jerry Coffin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.