web-dev-qa-db-ja.com

std :: shared_ptr <T []>特殊化がないのはなぜですか?

標準は、デストラクタからstd::unique_ptrを正しく呼び出すdelete[]のテンプレート特殊化を提供します。

void func()
{
   std::unique_ptr< int[] > arr(new int[10]);

   .......
}

std::shared_ptrでは、この特殊化は利用できないため、delete[]を正しく呼び出す削除機能を提供する必要があります。

void func()
{
    // Usage
    shared_ptr array (new double [256], [](double* arr) { delete [] arr; } ); 

    ..............
}

これは単に見落としですか? (std::copy_ifがあるのと同じ方法で)または理由がありますか?

65
mark

LWG(C++委員会のライブラリワーキンググループ)は可能性を簡単に検討しましたが、そのアイデアには議論の余地がありました。論争は主に、投棄された可能性がある_shared_ptr<T[]>_提案に追加された機能に関するものでした(_shared_ptr<T[]>_の算術)。

しかし、最終的に本当の本当の理由は、議論されたものの、LWGの前でこれを行うための実際の書面による提案がなかったことです。それは、誰かの優先リスト(私のリストを含む)を十分に泡立たせず、提案書を作成するための時間を費やすことはありませんでした。

数人のLWGメンバー間で、このトピックに関して非公式の会話が最近新たに始まり、私は個人的にそれをプロトタイプ化しました。しかし、それについての書面による提案はまだありません。私はそれがツールボックスのまともな追加ツールになると思います。それが実際に起こるかどうかは誰にも分からない。

更新

_shared_ptr_の配列サポートにドラフトTSが追加されました:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4077.html

更新(2017)

これは現在、C++ 17でサポートされています。 shared_ptr::shared_ptr() のケース3を参照してください

69
Howard Hinnant