2017-05-18 22 views
1

weak_ptrのためのC++のドラフト標準mandates次のコンストラクタ:C++:weak_ptrにshared_ptr &&コンストラクタがないのはなぜですか?

weak_ptr(const weak_ptr& r) noexcept; 
template<class Y> weak_ptr(const weak_ptr<Y>& r) noexcept; 
template<class Y> weak_ptr(const shared_ptr<Y>& r) noexcept; 

weak_ptr(weak_ptr&& r) noexcept; 
template<class Y> weak_ptr(weak_ptr<Y>&& r) noexcept; 

私は次のコンストラクタを見ないように驚い:もちろん

template<class Y> weak_ptr(shared_ptr<Y>&& r) noexcept; 

機能shared_ptr作品へのconst参照から既存のコンストラクタrvalue参照バージョンが動作する任意のコンテキストで使用できます。しかし、weak_ptrを初期化するために、shared_ptrの右辺値を使用して、呼び出し側が共有参照を弱いものに破壊的に変換したい場合、後者は少なくとも2つのアトミック操作を保存できると考えています。

+0

'weak_ptr'は' shared_ptr'の存在について何か知っていますか? –

+1

あなたは何を保存しますか?現在のところ、 'weak_ptr'コンストラクタは弱カウンタをインクリメントするだけでよく、後で' shared_ptr'が破壊されると共有カウンタを減少させます(そして、指摘されたオブジェクトを破壊する可能性があります)。あなたの提案された移動コンストラクタが弱いカウンタを増やす必要がある場合は、共有カウンタを減らします(そして、指摘されたオブジェクトを破壊する可能性があります)。同じ操作、より早い時期に実行されます。 –

+0

@BradAllredはい。その存在について知っているべきである( 'weak_ptr'はコンストラクタがすでにそれを受け取り、それに変換できる)、そして共有されたコントロールブロック構造につ​​いて知っておくべきである。 –

答えて

4

weak_ptr<>は、shared_ptr<>で管理されているオブジェクトへの非所有ポインタを保持します。最後のshared_ptr<>の参照が削除されると、オブジェクトが削除されます。

あなたが欠けているコンストラクタが存在すると、移動の過程でオブジェクトを破壊するパラメータとして最後の既存のshared_ptr<>を渡すことがあります。したがって、既に削除されたオブジェクトを指すweak_ptr<>が残っています。

あまり意味がありませんよね?

+0

私はこれが答えだとは思わない。明らかに、即座に破壊される一時的な 'shared_ptr'(例えば、関数からの戻り値)で既存のconst参照コンストラクタを呼び出すのと同じように、空の弱いポインタを使用するのと同様に、セマンティクスを得ることができます。結局のところ、最後の参照が落とされた後に空になるのは、 'weak_ptr'の全体の点です。 – jacobsa

+0

@jacobsaその場合、あなたは当然のことです(しかし、とにかくそれは誰もしません)。しかし、あなたの新しいコンストラクタでは、実際に(少なくとも)2番目のshared_ptr参照があった場合を除いて、空の弱いポインタで終わることになります。私はそのような動作のユースケースを見ることはできません。 – Rene

+0

@jacobsaこれを行うのが最も洗練されたソリューションではありません。 – Bernard

関連する問題