当我可以创建共享指针时,为什么我不能创建指向数组的唯一指针?

Why can't I make a unique pointer to an array, when I can make a shared pointer?

本文关键字:创建 指针 数组 唯一 不能 为什么 共享 我可以      更新时间:2023-10-16

以下内容无效:

#include <memory>
#include <iostream>
typedef double zip[10];
int main()
{
    std::unique_ptr<zip> s = std::make_unique<zip>();
    (*s)[0] = 2.0;
    std::cout << (*s)[0] << std::endl;
    return 0;
}

但以下内容是完全有效的:

int main()
{
    std::shared_ptr<zip> s = std::make_shared<zip>();
    (*s)[0] = 2.0;
    std::cout << (*s)[0] << std::endl;
    return 0;
}

为什么会有这种差异?我错过了什么?

区别在于shared_ptr可能指向也可能不指向数组。任何特定的shared_ptr<T>实例都可能指向单个T或一组T

相比之下,unique_ptr<T>总是指向单个T,而unique_ptr<T[]>指向一个T数组。它直接在类型本身中编码。因此,存储数组的版本具有适当的operator[]重载,而另一个版本则没有。

还应该指出的是,shared_ptr::operator[]是 C++17 的补充,unique_ptr<T[]>::operator[]一直存在。

因为不允许在已知边界的数组上make_unique。看为什么不允许使用"make_unique<T[N]>"?和 https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique