Как вернуть вектор указателей (и владения) С++ 11

У меня есть метод factory, который создает кучу объектов и возвращает указатели на них. Собственность на передачу объектов вызывающему:

std::vector<animal*> create_zoo();

Это работает, но подвержено утечке памяти.

auto zoo = create_zoo();

Вектор находится в стеке и автоматически очищается, а содержащиеся объекты - нет.

Возвращаются объекты различных подтипов. Сохранять значения вместо указателей не будет.

Я думал использовать

std::vector<std::unique_ptr<animal> > create_zoo();

но unique_ptr не имеют семантики копии, и я возвращаю значение vector по значению, которое теоретически создает копию.

Я мог бы положить vector в кучу, чтобы избежать этого

std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo();

но это становится нелепым.

Это тоже должно работать:

std::vector<std::shared_ptr<animal> > create_zoo();

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

Я открыт для предложений. не должно быть std::vector. Я просто ищу хороший способ реализации factory, который возвращает право собственности на несколько объектов с современным С++. На данный момент я избегаю повышения. Я пытаюсь изучить новый материал С++ 11.

Ответ 1

std::vector<std::unique_ptr<animal>> будет работать нормально: возврат локально-функции приведет к его перемещению, а не копированию (или только если перемещение недоступно).