У меня есть случай, где я хочу сохранить список ресурсов в станд.:: вектор. Поскольку я вижу его, мои опции следующие:
Опция 1 позволяет создать недопустимые ресурсы, и опция 2 вынуждает меня использовать "кучу".
Я пропускаю какие-либо опции здесь?
Вам не нужен конструктор по умолчанию, чтобы иметь вектор экземпляров.
Единственное ограничение - вы не можете использовать vector :: resize с аргументом по умолчанию, если у класса нет конструктора по умолчанию.
vec.resize(20); // requires default constructor
но вы можете указать vector :: resize объект по умолчанию:
std::vector<foo> vec;
vec.resize(20, foo(10)); // give a sample object since foo has not default constructor
Вы можете хранить объекты с нетривиальным конструктором в векторе. Хранение объектов в контейнерах stl должно иметь семантику присваивания (конструктор копирования и оператор присваивания).
Третьим вариантом было бы использование Boost.PointerContainer. Однако ваши объекты все равно будут выделяться на куче по отдельности. Как заметил Йоханн, std::vector уже использует кучу для хранения объектов (смежно), поэтому нет способа полностью избежать кучи.
Часто не имеет смысла позволять ресурсам (таким как мьютексы, потоки ввода/вывода и т.д.) иметь семантику копирования. Поэтому их нужно сделать некопируемыми, сделав конструктор копирования и оператор присваивания частными. К сожалению, ограничение на некопируемость делает невозможным хранение ресурсов непосредственно как значений внутри контейнеров STL. Поэтому приходится прибегать либо к Boost.PointerContainer, либо к контейнерам умных указателей. В разделе Мотивация документации по Boost.PointerContainer объясняется, почему лучше использовать один из них, а не другой.