从 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
对象导致更可读的代码。
注意:此正确的表单不在标准中。然而,理由是部分地评论标准中的内容。