Я читаю о интеллектуальных указателях boost, и я не могу понять одну вещь: почему boost :: scoped_ptr нельзя использовать с контейнерами STL? Я читал, что это не для копирования, но что именно это означает и зачем это нужно STL?
Некоторые контейнерные операции, такие как 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
,
Не копируемый атрибут означает, что у класса есть конструктор копирования, поэтому вы не можете вызывать его вне класса. При работе с контейнерами stl элементы копируются или перемещаются, поэтому они не будут работать вместе.
Если вам нужно использовать умный указатель с контейнерами stl, вы должны использовать тот, который реализует операции перемещения (например, c ++ 11 unique_ptr).