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

Why is there no [] operator for std::shared_ptr?

本文关键字:没有 运算符 std shared 为什么 ptr      更新时间:2023-10-16

我想知道std::shared_ptr没有定义数组的[]运算符这一事实背后的理由是什么。特别是为什么std::unique_ptr具有此运算符而不是std::shared_ptr

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

std::shared_ptr缺少这样的专业化(在C++11中),这在相关问题中进行了讨论:为什么没有std::shared_ptr<T[]>专业化?

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

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