Стандарт C ++ 03 говорит, что элементы должны быть копируемыми и копируемыми для использования в стандартном контейнере. Таким образом, реализация может использовать все, что захочет.
В C ++ 0x эти требования предъявляются к каждой операции. (Как правило, элементы должны быть конструируемыми и назначаемыми для перемещения.)
Чтобы получить то, что вы хотите, вы должны использовать умный указатель, например shared_ptr
(из Boost, TR1 или C ++ 0x), и полностью отключить возможность копирования:
class ClassWithoutAss
{
public:
const int mem;
ClassWithoutAss(int mem):mem(mem){}
// don't explicitly declare empty destructors
private:
ClassWithoutAss(const ClassWithoutAss&); // not defined
ClassWithoutAss& operator=(const ClassWithoutAss&); // not defined
};
typedef shared_ptr<ClassWithoutAss> ptr_type;
std::vector<ptr_type> vec;
vec.push_back(ptr_type(new ClassWithoutAss(1)));
Указатели могут быть скопированы очень хорошо, а умный указатель гарантирует, что вы не утечки. В C ++ 0x вы можете сделать это лучше всего с std::unique_ptr
, используя преимущества семантики перемещения. (На самом деле вам не нужна общая семантика, но в C ++ 03 это проще всего.)