参见英文答案 >
Why isn’t there a std::shared_ptr<T[]> specialisation?1个
我想知道这个事实的基本原理是什么,std :: shared_ptr没有为数组定义[]运算符.特别是为什么std :: unique_ptr具有此运算符但不具有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 [i]编写ptr.get()i来解决).