为什么不允许在std :: auto_ptr上使用operator []

时间:2011-03-17 23:09:21

标签: c++ visual-c++-2010 auto-ptr

为什么不允许在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;'没有定义此运算符或转换为预定义运算符可接受的类型

4 个答案:

答案 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[]创建的对象数组。