いくつかの関数を考えてみましょう:
template<typename F>
void foo(F f) {
  std::unique_ptr<int> p = f();
  // do some stuff with p
}
unique_ptrはデフォルトのテンプレート引数 , default_deletefor を宣言するため、 に渡され、デフォルト以外のデリータでを返すD関数オブジェクトはコンパイルに失敗します。例えば、foounique_ptr
int x = 3;
foo([&x](){
    // use empty deleter
    return std::unique_ptr<int>(&x, [](int*){});
});
ただし、これが役立つ可能性があることはわかりましたが、それが不可能な直接的な理由はわかりません。これに対処するための一般的なアプローチはありますか?
編集
foo簡単な修正は、代わりに次を使用するように定義することです。
  std::unique_ptr<int, std::function<void(int*)>> p = f();
しかし、なぜこれを のインターフェースに組み込むことができなかったのunique_ptrでしょうか? クラス インターフェイスがこのジェネリック属性を提供できない理由はありますか? この種のものを新しい定義に「ラップ」するためのアプローチはありますか?
例えば、
template<typename T>
using Generic_unique_ptr =
  std::unique_ptr<
    T,
    std::function< void(typename std::unique_ptr<T>::element_type*) >
  >;
しかし、これは次のようなことを行う可能性があるため、危険に思えます。
Generic_unique_ptr<int> p(new int());
これにより、デリータが初期化されず、未定義の動作が示されます。おそらく、デフォルトのデリータとして のインスタンスを提供する方法はありますか? std::default_delete<T>