从 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[]> 来自 unique_ptr,阵列会
正确解除分配。
在C ++ 17中不再允许这样做。而是数组形式
std::shared_ptr<T[]> 应该使用。
为什么在C ++ 17中不允许这样做?发生了什么变化?
p0497r0:
unique_ptr中shared_ptr构造的约束不正确
[...]
根据实施经验,我认为正确的形式是:
备注: 除非,否则此构造函数不应参与重载决策 Y* 兼容 T* 和 unique_ptr<Y, D>::pointer 可转换为 element_type*。
“兼容”检查可防止不受欢迎的转换 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 对象导致更可读的代码。
注意:此正确的表单不在标准中。然而,理由是部分地评论标准中的内容。