来自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));
由于
获得了它的删除器(ashared_ptr
对象)来自std::default_delete<T[]>
,数组将 被正确地释放。unique_ptr
C++17 中不再允许这样做。而是数组形式 应该使用
。std::shared_ptr<T[]>
为什么C++17中不允许这样?发生了什么变化?
从 unique_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
会导致代码更具可读性。
注意:标准中没有这个正确的形式。然而,其基本原理部分是对标准内容的评论。