Я хочу знать, используют ли функции emplace
стандартной библиотеки C++ теги std::in_place
(чтобы указать, что содержащийся объект должен быть создан на месте)? Потому что функция emplace
появилась в С++ 11, а std::in_place
— в С++ 17.
@AlanBirtles Это похоже на ответ.
Весь смысл emplace
и ему подобных заключается в том, чтобы указать, что объект строится на месте. Реализации не разрешено создавать элемент и копировать/перемещать его в конечное место.
Основная причина, по которой in_place
используется в конструкторах, заключается в том, что конструкторы должны использовать разрешение перегрузки, чтобы сообщить, какой конструктор вы собираетесь вызывать (для any
и variant
они также указывают тип объекта для создания в качестве аргумента шаблона, поскольку вы не можете предоставить шаблон). аргументы конструкторам вне вывода аргументов шаблона). Поэтому, если вы хотите иметь что-то вроде отличия push_back/emplace_back
в конструкторе, вы должны сделать это с параметром, а не с именем функции.
Согласно документации используется только для варианта, опционального и любого