Создание объектов без копирования в std::map

Вы когда-нибудь пытались создать объект (value) в std::map-е без использования std::move? До сегодняшнего дня я не знал как это сделать.

КДПВ

В c++11 у std::map есть метод emplace с такой сигнатурой:

template< class... Args >
std::pair<iterator,bool> emplace( Args&&... args );

Вроде бы как inplace создание объектов возможно, но value_type в std::map есть std::pair< key_type, mapped_type >. Т.е. что бы сконструировать объект в std::map мы должны этот объект уже создать извне и как минимум будет вызван конструктор перемещения для объекта.

Так все же можно ли создать объект в std::map без вызова конструктора перемещения/копирования?

Ответ да, можно! Для этого нам потребуется замечательная константа std::piecewise_construct.

Пример:

Результат выполнения программы:

Как видно из примера, для 3-го случая вызывается только один конструктор.

Где это может пригодиться?

Лично для себя этот трюк я использую для объектов, которые не имеют конструктора перемещения или конструктора копирования. Без std::piecewise_construct пришлось бы объект оборачивать в какой-нибудь std::unique_ptr, что добавляет оверхеда к обращения к объекту.

comments powered by Disqus