Al examinar las funciones miembro de los contenedores STL, se me ocurrió una idea extraña. ¿Por qué las funciones como std::vector<T>::push_back(T)
no tienen un valor de retorno (opcional) (un iterador o incluso una referencia al objeto adjunto)? Sé std::string
funciones como insert
y erase
iteradores de retorno, pero eso es por razones obvias. Creo que a menudo guarda una segunda línea de código que a menudo sigue estas llamadas a funciones.Valores devueltos de la función contenedor STL
Estoy seguro de que los diseñadores de C++ tienen una muy buena razón, por favor me ilumine :)
ACTUALIZACIÓN: Estoy incluyendo un ejemplo de código en el mundo real aquí donde podría reducir la longitud del código:
if(m_token != "{")
{
m_targets.push_back(unique_ptr<Target>(new Dough(m_token)));
return new InnerState(*(m_targets.back()), this);
}
podría reducirse a
if(m_token != "{")
return new InnerState(*(m_targets.push_back(unique_ptr<Target>(new Dough(m_token)))), this);
Si asumo std::list::push_back
devuelve una referencia al elemento añadido. El código es un poco pesado, pero eso es principalmente (dos conjuntos de paréntesis) debido al constructor de unique_ptr
y lo desreferencia. Tal vez para mayor claridad una versión sin ningún tipo de punteros:
if(m_token != "{")
{
m_targets.push_back(Dough(m_token));
return new InnerState(m_targets.back(), this);
}
vs
if(m_token != "{")
return new InnerState(m_targets.push_back(Dough(m_token)), this);
Wow. Gran información, gracias! Todavía me deja preguntándome por qué no devolvieron un iterador por supuesto :). Tal vez porque podría entonces 'MyClass bar = * (myvector.push_back (functionReturningMyClass()));' y probablemente tenga el mismo problema que con devolver una referencia (¿o no?). – rubenvb
Supongo que la razón fueron los problemas de rendimiento, ya que eso requeriría la construcción de un iterador, y la copia de ese iterador, y eso es una sobrecarga, si el valor de retorno no se utiliza. – smerlin
¿No hubiera algún compilador decente que optimizara tal cosa? Probablemente no lo que el comité de estándares estaba mirando :) – rubenvb