首页 > 解决方案 > 为什么不明显使用`std::shared_ptr`工作?

问题描述

似乎std::shared_ptr<T[]>(与 C++ 17 一起添加)的明显用途是保存指向 的指针T,并delete[]在需要销毁托管对象时使用。但是这段代码:

#include <memory>

int main() {
    std::shared_ptr<int[]> sp(new int[3]);
    return 0;
}

不能使用我尝试过的任何在线编译器进行编译。在所有情况下,错误消息都是这样的变体:

/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/memory:3759:18:注意:候选模板被忽略:要求'is_convertible<int *, int (*)[]>::value'不满意 [with _Yp = int] 显式 shared_ptr(_Yp* __p,

也就是说,接受指针的构造函数会被 SFINAED 取出,因为指向元素类型的指针不能转换为指向数组的指针。这似乎在 C++ 17 标准和 C++ 20 中是必需的。

这真的是本意吗?我该如何使用该构造函数?或者,或者,如何在std::shared_ptr不明确指定删除器的情况下创建正确管理数组的对象?

标签: c++c++17shared-ptr

解决方案


推荐阅读