3

为什么 std::auto_ptr 上不允许使用运算符 []?

#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<_Ty>”未定义此运算符或转换为预定义运算符可接受的类型

4

4 回答 4

11

原因是它将使用而不是auto_ptr释放内容,因此不适用于处理堆分配的数组(用 构造),仅适用于处理用 构造的单个堆分配数组。deletedelete[]auto_ptrnew[]new

支持operator[]会鼓励开发人员将它用于数组,并且会错误地给人一种类型可以支持数组的印象,而实际上它不能。

如果您想要一个类似智能指针的数组类,请使用boost::scoped_array

于 2011-03-17T23:13:04.977 回答
2

因为std::auto_ptr不打算与数组一起使用。

此外,在您的样本中

std::auto_ptr<T> temp = new T(capacity); // T=int, capacity=5

实际上分配一个 intcapacity. 它不会像您预期的那样创建整数数组。

于 2011-03-17T23:12:30.983 回答
1

因为auto_ptr旨在保存指向单个元素的指针;它会在销毁时使用delete(特别是不使用delete[])。

您的示例没有做(我认为)您认为的事情。或者至少名称容量具有误导性,因为您只分配一个元素(并将容量值分配给它)。你的 for 循环没有任何意义。

于 2011-03-17T23:13:41.137 回答
1

auto_ptr和其他智能指针仅用于存储指向单个对象的指针。这是因为它们delete在析构函数中使用,而不是delete[]在存储指向数组的指针时需要使用。

如果您需要将对象数组包装在智能指针中,标准库不会提供任何帮助。但是,Boost 确实提供scoped_array了 ,它的行为类似于std::auto_ptr并用于保存由new[].

于 2011-03-17T23:17:37.703 回答