Véase this AS artículo en emplace_back contra push_back. Básicamente, permite que un objeto se construya a partir de los argumentos que se pasan a él sin necesidad de crear el objeto que se pasará primero. Se ahorra en gastos generales al eliminar una construcción de copia que normalmente ocurre como resultado de la creación de objetos para insertar.
Por lo que puede salirse con la suya:
unordered_map<int,int> foo;
foo.emplace(4, 5);
en lugar de
foo.insert(std::make_pair(4, 5));
Aún mejor, (y si no me equivoco), puede ir a través de esta ruta:
struct Bar{
int x,y;
Bar(int _x, int _y) : x(_x), y(_y){}
};
unordered_map<int,Bar> baz;
baz.emplace(4, 5, 6);
Y tomado de la Wiki en C++0x:
Debido a la naturaleza de la redacción de las referencias rvalue, y a algunas modificaciones a la redacción de las referencias lvalue (referencias regulares), las referencias rvalue permiten a los desarrolladores proporcionar un reenvío de funciones perfecto. Cuando se combina con plantillas variadic, esta capacidad permite plantillas de funciones que pueden enviar perfectamente argumentos a otra función que toma esos argumentos particulares. Esto es más útil para reenviar parámetros de constructor, para crear funciones de fábrica que llamarán automáticamente al constructor correcto para esos argumentos particulares.
que funciona de la siguiente manera:
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)...));
}
}
Una vez más, robado descaradamente del artículo de Wiki mencionado anteriormente.
El último ejemplo me parece extraño. Supongamos que tenemos 2 constructores para 'Clave':' Clave (int) 'y' Clave (int, int) 'y 2 para' Valor': 'Valor (int, int)' y 'Valor (int)', ¿cómo es? el compilador va a desambiguar en el caso de construir un par 'Key/Value' –
Primero que llegue, primero atendido, tomo? Entonces crea un 'X (int, int)' primero y luego un 'X (int)'. Lo probará más tarde y publicará de nuevo. También podría no compilar y lanzar un error de tiempo de compilación "ambiguo". – Xeo
@Matthieu M. No tengo idea, de verdad. El problema es que la especificación no está completamente formalizada en este momento, por lo que no podemos saber con certeza cómo se debe responder a este tipo de pregunta hasta que lo esté. Lo que necesitamos es un abogado de idiomas que venga y aclare las ambigüedades que tenga mi respuesta. Yo votaría eso en un abrir y cerrar de ojos. – wheaties