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

前端之家收集整理的这篇文章主要介绍了c – 为什么std :: shared_ptr没有[]运算符?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > Why isn’t there a std::shared_ptr<T[]> specialisation?1个
我想知道这个事实的基本原理是什么,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来解决).

猜你在找的C&C++相关文章