C++ 1d智能指针不';t使用语法(*)和#x2B+;
我正在学习智能指针。所以,我用箭头标出了我不懂的代码。代码如下所示。我在VisualStudio2019中尝试了以下代码。 为什么我不能使用增量运算符(*i)+其中我可以使用i[0]++C++ 1d智能指针不';t使用语法(*)和#x2B+;,c++,c++17,visual-studio-2019,smart-pointers,C++,C++17,Visual Studio 2019,Smart Pointers,我正在学习智能指针。所以,我用箭头标出了我不懂的代码。代码如下所示。我在VisualStudio2019中尝试了以下代码。 为什么我不能使用增量运算符(*i)+其中我可以使用i[0]++ shared_ptr<int[]> foo(shared_ptr<int[]>i) { cout << i << '\n'; (*i)++; // doesn't but works for shared_pt
shared_ptr<int[]> foo(shared_ptr<int[]>i)
{
cout << i << '\n';
(*i)++; // doesn't but works for shared_ptr<int>i as argument
i[0]++; // works
*i += 1; // <-- doesn't work
i[0] += 1; // <--- works
return i;
}
int main(int argc)
{
auto start = chrono::high_resolution_clock::now();
// int T;
//cin >> T;
// while (T--)
// {
std::unique_ptr<int[]> pointer(new int[5]); // <-- can do it
for (int i = 0; i < 5; ++i) pointer[i] = i;
auto pointer3 = make_unique<int[] >(new int[5]); // <--- can't do it Okay i know that there is no overload but what's reason for not having ?
cout << pointer << '\n';
auto pointer1 = std::move(pointer);
cout << pointer1 << '\n';
auto shrd_ptr = foo(std::move(pointer1));
cout << shrd_ptr << '\n';
// }
auto end = chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(end -start).count() <<'\n';
return 0;
}
如果
shared\u ptr
存储了一个数组,那么(并且只有在那时)shared\u ptr::operator[]
提供了对存储数组中各个元素的访问
shared\u ptr::operator*
提供对整个存储对象的访问。它是为所有类型的存储对象定义的。如果这是一个数组,那么这就是整个数组
这是对标准C/C++数组/指针语义的有意背离,其中
*x
和x[0]
在定义上是一回事shared_ptr
不会这样做,因为它的设计者不希望它这样做。这是因为智能指针是指向数组的指针,例如,(*i)+
可以尝试更改数组的起始位置。它基本上与执行intarr[10]相同;arr++代码>。为什么不将智能指针视为数组,并使用i[0]++
?或者更好地使用std::vector
或std::array
?我的建议是,不要将智能指针视为自删除指针,而是从所有权的角度来看。一个资源一次应该只有一个所有者吗?使用std::unique\u ptr
。资源的所有权可以共享吗?然后使用std::shared\u ptr
。在我看来,对本质上是数组或向量的内容使用手动和显式内存处理(或智能指针)几乎毫无意义。[]
版本的shared\u ptr
不允许您取消对*
的引用。我认为这是一个阻止数组和指针合并的设计决策。如果您想要一个shared\u ptr
元素,可以使用别名c'tor:std::shared\u ptr(i,i.get()+索引)
的生存期是从i
开始的,但poitner是从i.get()+index
开始的。你不能从unique\u ptr
转换到shared\u ptr
,因为正如@Someprogrammerdude所说,这会破坏目的,但你可以做std::shared\u ptr sp=std::move(向上)代码>其中up
是一个std::unique\u ptr
。这意味着如果您有一个函数,f
,返回一个std::unique_ptr
,您可以执行std::shared_ptr sp=f()代码>。在这一点上,没有办法回到唯一的\u ptr
。
Error C2088 '++': illegal for class
Error C2100 illegal indirection
Error (active) E0349 no operator "*" matches these operands
Error (active) E0349 no operator "*" matches these operands
Error (active) E0042 no instance of overloaded fucntion "make_unique" matches the argument list