为什么“std::shared_ptr<T[]>”的明显用法不起作用?

Pet*_*ker 6 c++ shared-ptr c++17

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

#include <memory>

int main() {
    std::shared_ptr<int[]> sp(new int[3]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

无法使用我尝试过的任何在线编译器进行编译。在所有情况下,错误消息都是以下内容的变体:

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

也就是说,采用指针的构造函数会得到 SFINAED ,因为指向元素类型的指针不可转换为指向数组的指针。这似乎是 C++ 17 标准和 C++ 20 中所要求的。

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

Fed*_*dor 2

您的程序是有效的并且应该可以工作。直到版本 10 为止,它error: no matching constructor for initialization of 'std::shared_ptr<int []>'仅在 Clang 及其标准库实现中出现,并在版本 11 中得到修复。已解决 buglibc++

在线演示: https: //gcc.godbolt.org/z/WdbdTTPPj