为什么不再允许从array的unique_ptr创建shared_ptr?

时间:2017-04-09 09:09:33

标签: c++ shared-ptr c++17

来自cppreference

  

在C ++ 11和C ++ 14中,构造std::shared_ptr<T>是有效的   std::unique_ptr<T[]>

std::unique_ptr<int[]> arr(new int[1]);
std::shared_ptr<int> ptr(std::move(arr));
     

由于shared_ptr获得了删除(a   来自std::default_delete<T[]>的{​​{1}}对象,数组将   正确解除分配。

     

C ++ 17中不再允许这样做。而是数组形式   应该使用unique_ptr

为什么在C ++ 17中不允许这样做?发生了什么变化?

1 个答案:

答案 0 :(得分:14)

p0497r0

  

来自unique_ptr

的shared_ptr构造的不正确约束      

[...]

     

根据实施经验,我认为正确的形式是:

     

备注:除非Y*T*兼容且unique_ptr<Y, D>::pointer可转换为element_type*,否则此构造函数不得参与重载决策。< / p>      

“兼容”检查可防止从unique_ptr<T[]>shared_ptr<T>的不良转化,并且“可转换为”检查可确保unique_ptr<Y, D>::get()的结果可以存储在shared_ptr中}并由shared_ptr<T>::get()返回。

换句话说,这是故意无效的,因为它不应该是有效的,而不仅仅是其他变化的副作用。

这对我有意义。其他程序员可能会将shared_ptr<T>视为只指向一个T对象。要求程序员在需要多个shared_ptr<T[]>对象时使用T会导致代码更易读。

注意:此正确的表格不在标准中。然而,基本原理部分是对标准中的内容的评论。