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

问题描述 投票:0回答:1

该标准提供了

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
一样)或者有什么原因吗?

c++ c++11 shared-ptr smart-pointers language-design
1个回答
72
投票

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 现在支持此功能。参见案例 3

shared_ptr::shared_ptr()

© www.soinside.com 2019 - 2024. All rights reserved.