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つのアトミック操作を保存できると考えています。
'weak_ptr'は' shared_ptr'の存在について何か知っていますか? –
あなたは何を保存しますか?現在のところ、 'weak_ptr'コンストラクタは弱カウンタをインクリメントするだけでよく、後で' shared_ptr'が破壊されると共有カウンタを減少させます(そして、指摘されたオブジェクトを破壊する可能性があります)。あなたの提案された移動コンストラクタが弱いカウンタを増やす必要がある場合は、共有カウンタを減らします(そして、指摘されたオブジェクトを破壊する可能性があります)。同じ操作、より早い時期に実行されます。 –
@BradAllredはい。その存在について知っているべきである( 'weak_ptr'はコンストラクタがすでにそれを受け取り、それに変換できる)、そして共有されたコントロールブロック構造について知っておくべきである。 –