2015-11-14 6 views
-1

У меня есть этот вопрос, потому что я читаю раздел для auto_ptr. Он говорит, что auto_ptr не может быть сохранен в векторе из-за его разрушительной копии и назначения. Я могу это понять как-то, и один пример, который я могу придумать, - это что-то вроде auto_ptr ap = vec[0], удивит меня. Но что, если я использую это осторожно и не делаю этого, могу ли я хранить auto_ptr в векторе? Есть ли какая-то более глубокая причина, почему я не могу хранить? Может быть, для реализации вектора внутренне необходимо это предположение о том, что элементы должны быть скопированы конструктивно?Почему элементы в векторе должны копироваться конструктивно?

Спасибо.

+2

'auto_ptr' устарел и очень прост в использовании. Попробуйте переключиться на 'unique_ptr', это упростит вам работу. –

ответ

0

При изменении размера вектора его элементы копируются в новый массив поддержки, здесь используется конструктор копирования. Если у вас достаточно новый компилятор, используйте вместо него std :: unique_ptr.

0

Поскольку вектор должен хранить уже построенный объект внутри своего хранилища. Таким образом, он должен скопировать объект в собственное хранилище.

Также вектор, обеспечивающий scope-safety, должен копировать/перемещать переданный объект.

Смотрите документацию push_back

std::vector::push_back 
void push_back(const T& value); (1) 
void push_back(T&& value); (2)  (since C++11) 

присоединяет заданное значение элемента до конца контейнера.

1) Новый элемент инициализируется как копия значения.

2) значение перемещается в новый элемент.

Параметры

значение - значение элемента для добавления

требования Тип

  • Т должен соответствовать требованиям CopyInsertable для того, чтобы использовать перегрузки

  • Т должен отвечают требованиям MoveInsertable, чтобы использовать перегруз

И CopyInsertable идентификатор определяется как

Указывает, что экземпляр типа можно скопировать построенный на месте, в неинициализированного хранения.