En primer lugar, soy consciente de this question, pero no creo que pregunte lo mismo.¿Por qué no se pudo sobrecargar push_back para hacer el trabajo de emplace_back?
Sé lo hace std::vector<T>::emplace_back
- y entiendo por qué lo usaría más push_back()
. Utiliza plantillas variadic que me permiten reenviar múltiples argumentos al constructor de un nuevo elemento.
Pero lo que no entiendo es por qué el comité estándar de C++ decidió que había una necesidad de una nueva función de miembro. ¿Por qué no podrían simplemente extender la funcionalidad de push_back()
? Por lo que yo puedo ver, push_back
podría estar sobrecargado en C++ 11 a ser:
template <class... Args>
void push_back(Args&&... args);
Esto no rompería la compatibilidad hacia atrás, mientras que le permite pasar N argumentos, incluidos los argumentos que pueden invocar un rvalue normal o copia constructor De hecho, el compilador de C++ 11 implementación de push_back()
simplemente llama emplace_back todos modos:
void push_back(value_type&& __x)
{
emplace_back(std::move(__x));
}
Por lo tanto, la forma en que lo veo, no hay necesidad de emplace_back()
. Todo lo que necesitaban agregar era una sobrecarga para push_back()
que acepta argumentos variados y reenvía los argumentos al constructor del elemento.
¿Me equivoco aquí? ¿Hay alguna razón por la cual se necesita una función completamente nueva aquí?
esto parece similar: http://stackoverflow.com/questions/4303513/push-back-vs-emplace-back – moka
Buena pregunta. @moka conoce la diferencia entre lo que hacen las dos funciones. Incluso se vinculó a esa pregunta en particular. –
Tienen diferentes significados, todo se explica en la pregunta que mencionaste que leíste. Compare 'v.emplace_back (123)' y 'v.push_back (123)' por ejemplo para 'vector v;' con conversión implícita de 'int'. –