2012-04-23 26 views
19

C++ 11's std :: shared_ptr <> cung cấp một loại toán tử bool.Tại sao không std :: weak_ptr <> cung cấp một chuyển đổi bool?

operator unspecified-bool-type() const; 

(Nó không phải là một thẳng lên operator bool() const do dangers from implicit casting loại bool.)

Tại sao không std :: weak_ptr <> có một nhà điều hành tương tự? Tôi thấy mình liên tục gõ

if(!wp.expired()) 

khi tôi muốn gõ

if(wp) 

Tại sao không chuyển đổi bool cho weak_ptr?

+1

Vì các tính năng không được triển khai theo mặc định? –

+1

'toán tử bool' bây giờ có thể được thực hiện một cách an toàn ngay lập tức trong C++ 11: http://stackoverflow.com/a/6242355/46642 –

Trả lời

28

if(!wp.expired()) gần như luôn luôn là một kiểm tra sai trong mã đa luồng, bởi vì ngay sau đó tuyên bố if con trỏ có thể hết hạn. Như vậy, nếu weak_ptr có chính xác điều đó như là ngữ nghĩa cho chuyển đổi bool, nó sẽ không bao giờ được sử dụng anyways.

Nếu bạn muốn kiểm tra xem con trỏ có còn sống hay không, hãy sử dụng lock và kiểm tra số shared_ptr thu được.

Nếu bạn muốn biết con trỏ có bị chết hay không, hãy sử dụng expired.

Như bạn có thể thấy, nó không có ý nghĩa để cung cấp một chuyển đổi boolean. Đối với shared_ptr, nó hoàn toàn không. Btw, toán tử chuyển đổi là explicit operator bool() const noexcept; trong C++ 11.

+0

" * Nếu bạn muốn kiểm tra xem con trỏ có còn sống hay không, hãy sử dụng khóa và kiểm tra shared_ptr thu được. * "Nguy hiểm vì bạn có thể gió loại bỏ con trỏ mạnh cuối cùng đến đối tượng, vì vậy bạn chỉ có thể làm điều này trong một ngữ cảnh trong đó nó được an toàn để gọi destructor của đối tượng. –

+0

Tôi sẽ đề nghị rằng bất kỳ ngữ cảnh nào là an toàn để gọi bất kỳ destructor của đối tượng, bởi vì destructors nên được viết theo cách mà họ có thể được gọi một cách an toàn bất cứ lúc nào (AIUI, điều này cần phải được trường hợp xử lý ngoại lệ để làm việc trong chung trường hợp, như stack unwinding có thể phá hủy bất kỳ đối tượng tùy ý). Tôi muốn được quan tâm đến một counterexample mặc dù. – Keiji

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