为什么 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]
).
我想知道 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]
).