Начиная с C ++ 11, std :: vector может прекрасно разместить объект, который не может быть скопирован. Однако не все методы вектора могут быть использованы. В частности, конструктор initializer_list
, который вы вызываете для инициализации вектора, не допускаю, что он является интуитивно понятным, я допускаю. В текущем стандарте intializer_list
всегда работает по копии, а не по ходу, это может измениться позже, я полагаю. Вот подпись конструктора:
vector(std::initializer_list<T> init, const Allocator& alloc = Allocator());
В любом случае, не оборачивая zoo1
и zoo2
на std::move
, вы попросили сделать копию zoo1
и zoo2
в любом случае для сборки std::initializer_object
Однако вы по-прежнему можете использовать конструктор по умолчанию, для которого не требуется копировать значение, а затем выполнить некоторые операции push_back
s, например
std::vector<Zoo> zoos;
zoos.push_back(std::move(zoo1));
zoos.push_back(std::move(zoo2));
Как упоминалось в rustyx
ответ на вопрос также может использовать emplace_back
для непосредственного построения вашего Zoo
объекта из любого Animal
на месте внутри вектора вместо перемещения уже построенного Zoo
внутри