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

时间:2018-12-28 19:44:15

标签: c++ c++17

以下无效:

#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;
}

为什么会有差异?我想念什么?

2 个答案:

答案 0 :(得分:3)

差异是因为shared_ptr可能会或可能不会指向数组。任何特定的shared_ptr<T>实例都可能指向单个TT的数组。

通过对比,unique_ptr<T>始终指向单个T,而unique_ptr<T[]>指向T的数组。它直接在类型本身中编码。因此,存储数组的版本具有适当的operator[]重载,而另一个没有。

还应注意,shared_ptr::operator[]是C ++ 17的附加功能,unique_ptr<T[]>::operator[]一直在那里。

答案 1 :(得分:-1)

因为不允许在已知范围的数组上使用make_unique。看到 Why is `make_unique<T[N]>` disallowed?https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique