为什么没有std :: shared_ptr <T []>专门化?

mar*_*ark 64 c++ shared-ptr c++11

该标准提供了一个模板特化std::unique_ptr,正确调用delete[]其析构函数:

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

   .......
}
Run Code Online (Sandbox Code Playgroud)

由于std::shared_ptr这种专业化不可用,因此有必要提供一个正确调用的删除器delete[]:

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

    ..............
}
Run Code Online (Sandbox Code Playgroud)

这只是一个疏忽吗?(以同样的方式存在std::copy_if)或是否有原因?

How*_*ant 70

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支持这一点.见案例3shared_ptr::shared_ptr()

  • @Nim:`std :: unique_ptr <T []>`(存在)对开销非常重要.与`vector <T>`不同,`unique_ptr <T []>`不包括容量或甚至大小的开销.客户端可能需要为大小添加外部开销,但是如果数组从未调整大小,则不是为了容量.现在这不会使`unique_ptr <T []>`更好`vector <T>`.实际上,我认为与前者相比,前者的用例很少见.但前者的用例率并非为零. (13认同)
  • @sellibitze:`shared_ptr <T []>`版本的好处是它只需要一个指针解引用来获取任何数组元素,而`shared_ptr <vector <T >>`需要两个(一个用于` shared_ptr`,一个存储在`vector`中的数组. (7认同)
  • @MikeMB yes - 大小按类型编码. (5认同)
  • 类似地,`shared_ptr <T []>`有时可以用较低的开销替换`shared_ptr <vector <T >>`.仅仅存在和继续支持`boost :: shared_array <T>`是一些程序员发现这样一个工具偶尔有用的参数. (4认同)
  • 第一个"为什么不存在......"问题,我已经看到了一个真正的答案,也是一个动态分配的数组?用vector和std :: array,真的看不到需要(?) (2认同)
  • 有没有原因,为什么每个人似乎都忽略了 shared_ptr&lt;std::array&lt;T,N&gt;&gt;?与我忽略的 shared_ptr&lt;T[]&gt; 相比有什么缺点吗? (2认同)