Mặc dù tôi hiểu tại sao không có operator==
cho shared_ptr
và unique_ptr
, tôi tự hỏi tại sao không có số nào cho shared_ptr
và weak_ptr
. Đặc biệt là vì bạn có thể tạo một weak_ptr
thông qua tham chiếu trên shared_ptr
. Tôi giả định rằng 99% thời gian bạn muốn lhs.get() == rhs.get()
. Bây giờ tôi sẽ tiếp tục và giới thiệu điều đó vào mã của tôi trừ khi ai đó có thể đặt tên cho tôi là một lý do chính đáng, tại sao người ta không nên làm một điều như vậy.Thiếu bình đẳng giữa shared_ptr và weak_ptr
Trả lời
weak_ptr
doesn 'có phương thức get()
vì bạn cần khóa rõ ràng weak_ptr
trước khi bạn có thể truy cập con trỏ cơ bản. Làm cho điều này rõ ràng là một quyết định thiết kế có chủ ý. Nếu việc chuyển đổi được ngầm định thì sẽ rất dễ dàng để viết mã sẽ không an toàn nếu đối tượng cuối cùng bị hủy trong khi con trỏ cơ bản thu được từ số weak_ptr
vẫn đang được kiểm tra.
This boost page có mô tả tốt về những cạm bẫy và lý do tại sao weak_ptr
có giao diện hạn chế như vậy.
Nếu bạn cần so sánh nhanh, bạn có thể thực hiện shared == weak.lock()
. Nếu so sánh là đúng thì bạn biết rằng weak
vẫn phải hợp lệ khi bạn giữ riêng shared_ptr
cho cùng một đối tượng. Không có đảm bảo như vậy nếu so sánh trả về sai.
Gọi 'khóa' cho một phần lớn mã thực sự có ý nghĩa hơn. Quyết định thiết kế tốt. – abergmeier
Vì nó có chi phí.
A weak_ptr
giống như người quan sát, không phải là con trỏ thực. Để thực hiện bất kỳ công việc nào với nó, trước tiên bạn cần lấy một shared_ptr
từ nó bằng cách sử dụng phương thức lock()
của nó.
Điều này có tác dụng giành quyền sở hữu, nhưng tốn kém như sao chép số shared_ptr
thông thường (số lần tăng, v.v ...) nên không có gì là tầm thường.
Như vậy, bằng cách không cung cấp ==
, bạn buộc phải lùi lại và thực sự kiểm tra xem bạn có thực sự cần điều này hay không.
Tôi không chắc rằng so sánh bình đẳng cần phải quan tâm đến tính hợp lệ, và như vậy có thể được thực hiện với giá rẻ: hoặc 'weak_ptr' chỉ cùng một thực thể, trong trường hợp đó phải hợp lệ (hoặc 0), hoặc nó đề cập đến một thực thể khác, trong trường hợp này, chúng tôi không quan tâm liệu nó có hợp lệ hay không. –
@KonradRudolph: có thể, có thể không. Nhưng vì việc lấy con trỏ sẽ không an toàn nói chung (vì bạn sẽ có con trỏ nhưng sẽ không thể truy cập con trỏ), bạn không thể lấy con trỏ từ 'weak_ptr' và buộc phải đi qua' shared_ptr'. Vì vậy ... –
Không, lấy con trỏ là an toàn, miễn là nó được thực hiện * nội bộ *. –
- 1. shared_ptr & weak_ptr chuyển đổi
- 2. java.lang.Class và bình đẳng
- 3. Sự bình đẳng giữa 2 HashMap
- 4. Enum Boxing và Bình đẳng
- 5. Có vectơ weak_ptr, muốn trả về véc tơ của shared_ptr
- 6. tương đẳng cho bình đẳng heterogenous
- 7. bình đẳng với Double.NaN
- 8. bình đẳng trong javascript
- 9. Sự bình đẳng giữa hai số điện thoại
- 10. ActiveRecord bình đẳng đối tượng
- 11. bình đẳng logic trong C
- 12. Bản đồ và hồ sơ bình đẳng trong Clojure
- 13. Sự khác biệt giữa bình đẳng, sâu bằng và nghiêm ngặt ngang nhau
- 14. "Thử nghiệm đẳng cấp bình đẳng" trong mục tiêu-c
- 15. Tham khảo điều hành bình đẳng trong thực hiện điều hành bình đẳng
- 16. nhận ptr bình thường từ shared_ptr?
- 17. Tính bình đẳng và dung sai dấu chấm động
- 18. LINQ Trừ điều hành và đối tượng bình đẳng
- 19. Ghi đè Nhà điều hành Bình đẳng
- 20. Bình đẳng về các ràng buộc
- 21. Đối sánh mẫu Bất bình đẳng
- 22. Scala bình đẳng với kiểm tra loại?
- 23. Kiểm tra sự bình đẳng với NSNull
- 24. weak_ptr của một lớp cơ sở, trong khi shared_ptr là của một lớp dẫn xuất?
- 25. Sự bình đẳng của hai cấu trúc trong C#
- 26. bình đẳng đôi vs là trong python
- 27. chuỗi So sánh bình đẳng trong ksh
- 28. double.NaN Bình đẳng trong MS Test
- 29. C# yêu cầu bình đẳng từ điển
- 30. Sự bình đẳng cho .NET PropertyInfos
Nhưng 'weak_ptr' không có phương thức' get'. –
Derp. Đã hiểu sai câu hỏi. –