为什么不再允许从数组的 unique_ptr 创建shared_ptr?

问题描述 投票:0回答:1

来自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中不允许这样?发生了什么变化?

c++ c++17 shared-ptr smart-pointers language-design
1个回答
14
投票

p0497r0

从 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
会导致代码更具可读性。

注意:标准中没有这个正确的形式。然而,其基本原理部分是对标准内容的评论。

© www.soinside.com 2019 - 2024. All rights reserved.