来自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中不允许这样做?发生了什么变化?
答案 0 :(得分:14)
来自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
会导致代码更易读。
注意:此正确的表格不在标准中。然而,基本原理部分是对标准中的内容的评论。