Почему оператор [] не разрешен в std :: auto_ptr - PullRequest
3 голосов
/ 18 марта 2011

Почему оператор [] не разрешен в 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 ]

11 голосов
/ 18 марта 2011

Причина в том, что auto_ptr освободит контент, используя delete вместо delete[], и поэтому auto_ptr не подходит для обработки массивов, выделенных в куче (созданных с new[]), и подходит только дляобработка отдельных выделенных в куче массивов, созданных с помощью new.

Поддержка operator[], побудит разработчиков использовать его для массивов и по ошибке создаст впечатление, что тип может поддерживать массивы, когда на самом делеэто невозможно.

Если вам нужен класс массива, подобный интеллектуальному указателю, используйте boost :: scoped_array .

2 голосов
/ 18 марта 2011

Поскольку std::auto_ptr не предназначен для использования с массивами.

Кроме того, в вашем образце

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

фактически выделяет сингл int и инициализирует его с capacity. Он не создает массив целых чисел, как вы, похоже, предполагали.

1 голос
/ 18 марта 2011

auto_ptr и другие интеллектуальные указатели предназначены только для хранения указателя на один объект. Это потому, что они используют delete в деструкторе, а не delete[], что было бы необходимо, если бы он хранил указатель на массив.

Если вам нужно обернуть массив объектов в умный указатель, стандартная библиотека не предлагает ничего, чтобы помочь. Тем не менее, Boost предлагает scoped_array, который ведет себя подобно std::auto_ptr и предназначен для хранения массивов объектов, созданных new[].

1 голос
/ 18 марта 2011

Поскольку auto_ptr предназначен для хранения указателя на один элемент; он будет использовать delete (в частности, не delete[]) для уничтожения.

Ваш пример не делает то, что (я думаю) вы думаете, что делает. Или, по крайней мере, имя емкости вводит в заблуждение, потому что вы выделяете только один элемент (и присваиваете ему значение Capacity`). Ваш цикл for не имеет смысла.

...