以下无效:
#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;
}
为什么会有差异?我想念什么?
答案 0 :(得分:3)
差异是因为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[]
一直在那里。
答案 1 :(得分:-1)
因为不允许在已知范围的数组上使用make_unique
。看到
Why is `make_unique<T[N]>` disallowed?
和https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique