为什么不允许在std :: auto_ptr上使用operator []?
#include <iostream>
using namespace std ;
template <typename T>
void foo( T capacity )
{
auto_ptr<T> temp = new T[capacity];
for( size_t i=0; i<capacity; ++i )
temp[i] = i; // Error
}
int main()
{
foo<int>(5);
return 0;
}
在Microsoft Visual C ++ 2010上编译。
错误:错误C2676:二进制'[':'std :: auto_ptr&lt; _Ty&gt;'没有定义此运算符或转换为预定义运算符可接受的类型
答案 0 :(得分:11)
原因是auto_ptr
将使用delete
而不是delete[]
释放内容,因此auto_ptr
不适合处理堆分配的数组(使用{构造) {1}})并且仅适用于处理使用new[]
构造的单个堆分配数组。
支持new
会鼓励开发人员将它用于数组,并且会错误地给人一种类型可以支持数组的印象,实际上它不能。
如果您需要类似智能指针的数组类,请使用boost::scoped_array。
答案 1 :(得分:2)
因为std::auto_ptr
不打算与数组一起使用。
此外,在你的样本中
std::auto_ptr<T> temp = new T(capacity); // T=int, capacity=5
实际分配单 int
并使用capacity
对其进行初始化。它不会像你想象的那样创建一个整数数组。
答案 2 :(得分:1)
因为auto_ptr
旨在保存指向单个元素的指针;它将使用delete
(特别是delete[]
)来销毁它。
你的例子不是你想的那样(我认为)。或者至少名称容量具有误导性,因为您只分配一个元素(并为其分配容量值)。你的for循环没有明智的意义。
答案 3 :(得分:1)
auto_ptr
和其他智能指针仅用于存储指向单个对象的指针。这是因为它们在析构函数中使用delete
,而不是delete[]
,如果它存储指向数组的指针则需要它。
如果需要在智能指针中包装对象数组,标准库不提供任何帮助。但是,Boost确实提供scoped_array
,其行为类似于std::auto_ptr
,用于保存由new[]
创建的对象数组。