Как поместить объект без аргументов конструктора в контейнер STL?

Предположим, у меня есть класс, конструктор которого не принимает аргументов, и контейнер STL его объектов: list<Object> lst; Есть ли способ вставить новый объект на место?

Я знаю, что что-то вроде lst.push_back(Object()); будет работать так же быстро, как и при использовании конструктора перемещения, однако кажется немного странным, что нет функции для простого создания нового объекта в конце списка без каких-либо аргументов, в то время как уже есть emplace, который мог бы соответствовать этому месту.

Не могли бы вы дать какое-то объяснение, если это на самом деле невозможно?


person pkubik    schedule 17.07.2014    source источник
comment
Пробовали ли вы std::vector::emplace_back()?   -  person πάντα ῥεῖ    schedule 17.07.2014


Ответы (2)


Ну, emplace_back() делает именно это.

Просто используйте lst.emplace_back();, и эта функция создаст объект в конце списка.

person JBL    schedule 17.07.2014
comment
Спасибо, это работает. Это была моя первая интуиция, однако KDevelop предложил сделать это lst.emplace_back<Object>();, что по какой-то причине не сработало. Смущает, что среди множества опробованных мной версий не было этой самой простой. Кстати. есть идеи, почему явная версия типа не работала? - person pkubik; 17.07.2014
comment
@pkubik Это странное предложение, потому что emplace_back - это вариативный шаблон, параметризуемый только аргументами конструктора. Так что, очевидно, это не должно работать, если у вас нет конструктора, который принимает Object в качестве единственного аргумента. - person JBL; 17.07.2014
comment
В любом случае не должно иметь смысла указывать тип создаваемого объекта. Этот тип известен, как только вы объявляете список. - person JBL; 17.07.2014

Вы можете использовать lst.emplace_back();

person Neil Kirk    schedule 17.07.2014