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

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

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

std::unique_ptr 仅在数组的特化中定义 operator[]std::unique_ptr<T[]>。对于非数组指针,operator[] 无论如何都没有多大意义(仅 [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[],因为它使用类型擦除来区分数组和非数组(智能指针类型独立于提供的删除器)。

如果您想知道为什么数组没有 shared_ptr 专业化:那是一个提议,但没有包含在标准中(主要是因为 您可以通过编写 ptr.get() + i 对于 ptr[i]).