ikh*_*ikh 11 c++ shared-ptr c++17
在C++ 11和C++ 14中,
std::shared_ptr<T>从以下构造a是有效的std::unique_ptr<T[]>:Run Code Online (Sandbox Code Playgroud)std::unique_ptr<int[]> arr(new int[1]); std::shared_ptr<int> ptr(std::move(arr));由于
shared_ptr从中获取其删除(std::default_delete<T[]>对象)unique_ptr,因此将正确地释放数组.在C++ 17中不再允许这样做.而
std::shared_ptr<T[]>应该使用数组形式 .
为什么在C++ 17中不允许这样做?发生了什么变化?
小智 14
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对象时使用会导致代码更易读.
注意:此正确的表格不在标准中.然而,理由部分是对标准中的内容进行评论.