См. эту SO статью о emplace_back против push_back.По сути, он позволяет построить объект из аргументов, переданных в него, без необходимости создания объекта, который будет передан первым.Это экономит накладные расходы, удаляя конструкцию копирования, которая обычно происходит в результате создания объектов для вставки.
Таким образом, вы можете обойтись без этого:
unordered_map<int,int> foo;
foo.emplace(4, 5);
вместо
foo.insert(std::make_pair(4, 5));
Еще лучше, (и если я не ошибаюсь) вы можете пройти по этому маршруту:
struct Bar{
int x,y;
Bar(int _x, int _y) : x(_x), y(_y){}
};
unordered_map<int,Bar> baz;
baz.emplace(4, 5, 6);
И взято из вики на C ++ 0x :
Из-за природы формулировки ссылок на rvalue и некоторых изменений в формулировке ссылок на lvalue (регулярные ссылки) ссылки на rvalue позволяют разработчикам обеспечить идеальную пересылку функций.В сочетании с шаблонами с переменными параметрами эта возможность позволяет использовать шаблоны функций, которые могут идеально передавать аргументы другой функции, которая принимает эти конкретные аргументы.Это наиболее полезно для пересылки параметров конструктора, для создания фабричных функций, которые будут автоматически вызывать правильный конструктор для этих конкретных аргументов.
, который работает следующим образом:
template<typename TypeToConstruct> struct SharedPtrAllocator {
template<typename ...Args> std::shared_ptr<TypeToConstruct> construct_with_shared_ptr(Args&&... params) {
return std::shared_ptr<TypeToConstruct>(new TypeToConstruct(std::forward<Args>(params)...));
}
}
Опять же, бесстыдно украденный из упомянутой выше статьи Wiki.