boost :: scoped_ptr и STL в переполнении стека

Я читаю о интеллектуальных указателях boost, и я не могу понять одну вещь: почему boost :: scoped_ptr нельзя использовать с контейнерами STL? Я читал, что это не для копирования, но что именно это означает и зачем это нужно STL?

1

Решение

Некоторые контейнерные операции, такие как std::vectorконструктор

vector(size_type n, const T& value, const Allocator& = Allocator());

или же std::vector::resizeтребуют, чтобы T быть CopyInsertable, Это требует, чтобы вектор был в состоянии вызвать TКопируй конструктор. Таким образом, вы не могли построить std::vector<boost::scoped_ptr<U>> используя этот конструктор.

До C ++ 11 требования T были более строгими. Начиная с последнего стандарта, требования разрабатываются для каждой операции контейнера, а не для контейнера в целом. Так что, вероятно, есть много ситуаций, в которых вы можете использовать вектор boost::scoped_ptrs,

3

Другие решения

Не копируемый атрибут означает, что у класса есть конструктор копирования, поэтому вы не можете вызывать его вне класса. При работе с контейнерами stl элементы копируются или перемещаются, поэтому они не будут работать вместе.

Если вам нужно использовать умный указатель с контейнерами stl, вы должны использовать тот, который реализует операции перемещения (например, c ++ 11 unique_ptr).

1