为什么std :: shared_ptr没有[]运算符?

时间:2015-01-07 12:43:52

标签: c++ c++11 shared-ptr unique-ptr

我想知道事实背后的原因是std::shared_ptr没有为数组定义[]运算符。特别是std::unique_ptr为什么要使用此运算符,而不是std::shared_ptr

1 个答案:

答案 0 :(得分:11)

std::unique_ptr仅在数组的专门化中定义operator[]std::unique_ptr<T[]>。对于非数组指针,运算符[]无论如何都没有多大意义(仅[0])。

std::shared_ptr的这种专业化缺失(在C ++ 11中),在相关问题中讨论:Why isn't there a std::shared_ptr<T[]> specialisation?

除非您提供自定义删除器,否则不应将非数组智能指针与数组分配一起使用。特别是,unique_ptr<int> p = new int[10]不好,因为它会调用delete而不是delete[]。请改用unique_ptr<int[]>,调用delete[]。 (这个实现了operator[])。如果您使用shared_ptr来保留T[],则需要使用自定义删除工具。另请参阅shared_ptr to an array : should it be used? - 但它没有提供operator[],因为它使用类型擦除来区分数组和非数组(智能指针类型独立于提供的删除器)。 / p>

如果你想知道为什么数组没有shared_ptr专业化:这是一个提案,但没有包含在标准中(主要是因为你可以通过写{{1}来解决} ptr.get() + i )。