2012-02-06 5 views
13

unique_ptr::resetには、2番目の引数として受け取るコンストラクタと一致するように、const deleter&deleter&&をとるオーバーロードはありませんか?unique_ptr :: resetにdeleterをとるオーバーロードがないのはなぜですか?

unique_ptrに格納されているデリータは、コピー割り当てまたは引数付きの移動割り当てresetになります。デリーターがコピー不可または移動不可の場合、resetの対応するオーバーロードの呼び出しはコンパイルされません。これは、コンストラクタとの一貫した動作であるようです。

答えて

24

私はそれを追加することについて考えていますが、移動代入演算子と同等の機能を得ることができます:

ptr = unique_ptr<T, D>(new T(another_value), D(another_state)); 

だから私は適度に小さいAPIを保つの利益のためにresetと同じことを言っていないために選びました。だから

ptr = {new T(another_value), D(another_state)}; 
+3

'なぜ'の質問に対して唯一の_authoritative_答えがあるため+1。 – ildjarn

+0

リセット機能があった場合、shared_ptrの方がよりクリーンで一貫性がありますか?私にとっては、カスタム・デリター機能を持っているときには、特にきれいに感じます。たとえば、次のようにします。 'ptr = unique_ptr (new_raw_ptr、deleter_function);' vs 'ptr.reset(new_raw_ptr、deleter_function);'あるいは、同じdeleter_functionを保持できればさらに良いでしょう。したがって、 'ptr.reset(new_raw_ptr);'のようになります。 – felipou

+1

@felipou:後者の作品。前者については、あなたがどうやってそれを実現できるかを以下に示します:http://cplusplus.github.io/LWG/lwg-active.html#submit_issue –

3

デリータは、構築時にオブジェクトに格納されるためです。 Deleter型はテンプレート引数であるため、構築後に別のクラスを使用するようにクラスを「変換」する方法はありません。

+0

コピー代入演算子を呼び出すか:

更新

そして、私が住んでいるし、学ぶ...

構文は、実際に私は上記示したものよりはるかに簡単することができそれぞれ代入演算子を移動します。あなたのdeleterが許容可能なアクセス可能なものを持っていない場合、それはコンパイルされません。 – David

+0

単純な目的に役立つクラスではないか? –

+0

コンストラクトをコピーしてコンストラクトを作成することができます。これは、私にとって他の機能と一貫した複雑さのレベルのようです(つまり複雑ではありません)。 – David

関連する問題