Tôi tự hỏi lý do là gì đằng sau thực tế, rằng std::shared_ptr
không xác định toán tử []
cho mảng. Cụ thể, tại sao std::unique_ptr
có tính năng toán tử này chứ không phải std::shared_ptr
?Tại sao không có toán tử [] cho std :: shared_ptr?
Trả lời
std::unique_ptr
chỉ xác định operator[]
trong chuyên môn cho mảng: std::unique_ptr<T[]>
. Đối với con trỏ không có mảng, toán tử [] không có ý nghĩa gì nhiều (chỉ có [0]
).
như một chuyên môn hóa cho std::shared_ptr
là mất tích (trong C++ 11), được thảo luận trong các câu hỏi liên quan: Why isn't there a std::shared_ptr<T[]> specialisation?
Bạn không nên sử dụng một con trỏ thông minh phi mảng với mảng phân bổ, trừ khi bạn cung cấp một tùy chỉnh deleter. Cụ thể, unique_ptr<int> p = new int[10]
là xấu, vì nó gọi delete
thay vì delete[]
. Thay vào đó, hãy sử dụng unique_ptr<int[]>
, gọi số delete[]
. (Và điều này thực hiện operator[]
). Nếu bạn đang sử dụng shared_ptr
để giữ T[]
, bạn cần phải sử dụng một deleter tùy chỉnh. Xem thêm shared_ptr to an array : should it be used? - nhưng nó không cung cấp operator[]
, vì nó sử dụng loại xóa để phân biệt giữa mảng và không mảng (kiểu con trỏ thông minh độc lập với dấu phân cách được cung cấp).
Nếu bạn tự hỏi tại sao không có shared_ptr
chuyên môn cho các mảng: đó là một đề nghị, nhưng không được bao gồm trong tiêu chuẩn (chủ yếu là từ bạn có thể làm việc xung quanh bằng cách viết ptr.get() + i
cho ptr[i]
).
'shared_ptr' sử dụng' delete' _you_ cung cấp (nếu bạn cung cấp một); nó hoàn toàn có thể cung cấp một cái gì đó như '[] (T * p) {delete [] p; } '. –
Vâng, đó là chủ yếu liên quan đến 'unique_ptr', kể từ khi thay đổi deleter cho con trỏ đó thay đổi loại (không có loại tẩy xoá ở đó). Và đối với 'shared_ptr', chúng ta đã có một chuyên môn xử lý' delete [] '. – leemes
@JamesKanze Cập nhật, tôi hy vọng nó rõ ràng hơn bây giờ ... – leemes
- 1. Tại sao không có toán tử [] cho danh sách std ::?
- 2. Tại sao không có chuyên môn cho std :: shared_ptr <T[]>?
- 3. Tại sao tôi không thể sử dụng toán tử bool() cho std :: ofstream
- 4. Tại sao không có thuật toán std :: copy_if?
- 5. lý do tại sao là std :: shared_ptr sử dụng các hoạt động cpu nguyên tử
- 6. Tại sao không có chuyên môn :: shared_ptr <T[]>?
- 7. Tại sao std :: shared_ptr <T> = std :: unique_ptr <T[]> biên dịch, trong khi std :: shared_ptr <T[]> = std :: unique_ptr <T[]> thì không?
- 8. Tại sao toán tử() thay đổi cho std :: function trong C++ 17?
- 9. C++ 0x std :: shared_ptr vs. boost :: shared_ptr
- 10. Tôi có nên sử dụng toán tử + = thay cho toán tử + để nối chuỗi std :: string không?
- 11. Tại sao toán tử unique_ptr-> không bị quá tải?
- 12. Gán cho một thành viên biến std :: shared_ptr
- 13. Tại sao không có hàm std :: allocate_unique trong C++ 14?
- 14. Tại sao không std :: weak_ptr có operator->?
- 15. Tại sao không std :: sort sử dụng toán tử của tôi <thi
- 16. Tại sao toán tử ++ trả về giá trị không const?
- 17. Tại sao không shared_ptr <A> chuyển đổi ẩn thành shared_ptr <A const>?
- 18. Tại sao "extern template" không hoạt động với shared_ptr?
- 19. toán tử std :: string() const?
- 20. Doxygen có thể nhận diện std :: shared_ptr hoặc std :: map
- 21. Tại sao không phải là toán tử [] const cho các bản đồ STL?
- 22. shared_ptr in std :: tr1
- 23. Tại sao không std :: pair có iterators?
- 24. std :: shared_ptr không hoạt động với phạm vi cho
- 25. Tại sao không có std :: stou?
- 26. Xóa một std :: vector cần một toán tử gán. Tại sao?
- 27. Tại sao có một toán tử sizeof ... trong C++ 0x?
- 28. Tại sao nó không sử dụng toán tử quá tải của tôi cho ++?
- 29. Tại sao tăng :: filesystem :: path và std :: filesystem :: toán tử đường dẫn +?
- 30. Tại sao R không cho phép toán tử $ trên vectơ nguyên tử?
'unique_ptr' có chuyên môn quản lý mảng,' shared_ptr' không. 'toán tử []' chỉ được cung cấp cho chuyên môn đó. Bạn có hỏi tại sao 'shared_ptr' không có cái đó? – juanchopanza
Tôi hy vọng điều này sẽ trả lời câu hỏi của bạn http://stackoverflow.com/questions/8947579/why-isnt-there-a-stdshared-ptrt-specialisation – Swtsvn
@juanchopanza Tôi cho là vậy. – Haatschii