2012-04-23 7 views
19

C++ 11のstd :: shared_ptr <>は、一種のbool演算子を提供します。なぜstd :: weak_ptr <>はブール変換を行いませんか?

operator unspecified-bool-type() const; 

(それが原因タイプbooldangers from implicit castingにまっすぐアップoperator bool() constではありません。)

なぜのstd :: weak_ptrを<>は、同様の演算子を持っていませんか?私は

if(wp) 

のweak_ptrのためのなぜ無ブール型変換をしたいときに自分自身が常に

if(!wp.expired()) 

を入力して見つけますか?

+1

機能はデフォルトで実装されていないため? –

+1

'オペレータbool'が安全にC++ 11でストレートアップを行うことができます。http://stackoverflow.com/a/6242355/46642 –

答えて

28

if(!wp.expired())は、そのifステートメントの直後にポインタが期限切れになる可能性があるため、マルチスレッドコードではほとんど常に間違っています。そのため、boolの変換のセマンティクスと同じものがweak_ptrの場合は、それは決して使用されません。ポインタが生きているかどうかをチェックしたい場合は

lockを使用して得られshared_ptrを確認してください。

あなたは、ポインタが死んでいるかどうかを知りたい場合は、expiredを使用しています。あなたが見ることができるように

、それだけでboolean型変換を提供しても意味がありません。 shared_ptrについては、それは完全に行います。 Btwの変換演算子はC++ 11ではexplicit operator bool() const noexcept;です。

+0

「*あなたは、ポインタが生きているかどうかを確認したい場合は、ロックとチェックを使用取得されたshared_ptr。* "危険なのは、オブジェクトに対する最後の強いポインタを破棄してしまう可能性があるためです。そのため、オブジェクトのデストラクタを呼び出すことが安全だったコンテキストでのみ行うことができます。デストラクタは、それらが安全にいつでも呼び出すことができるような方法で記述する必要がありますので、 –

+0

が、私は、任意のコンテキストは、任意のオブジェクトのデストラクタを呼び出すために安全であることを示唆している(AIUIが、これは一般的に動作するように例外処理のためのケースである必要があります場合によっては、スタックの巻き戻しが任意のオブジェクトを破壊する可能性があります)。私は反例に興味があるだろう。 – Keiji

関連する問題