Beim Betrachten der Elementfunktionen der STL-Container ist mir ein seltsamer Gedanke aufgefallen. Warum haben Funktionen wie std::vector<T>::push_back(T)
keinen (optionalen) Rückgabewert (Iterator oder gar einen Verweis auf das angehängte Objekt)? Ich weiß, std::string
Funktionen wie insert
und erase
Iteratoren zurückgeben, aber das ist aus offensichtlichen Gründen. Ich denke, es würde oft eine zweite Codezeile speichern, die häufig auf diese Funktionsaufrufe folgt.Rückgabewerte der STL-Containerfunktion
Ich bin sicher, dass die Designer von C++ einen sehr guten Grund haben, bitte erleuchte mich :)
UPDATE: Ich bin auch eine reale Codebeispiel hier, wo es Codelänge reduzieren könnte:
if(m_token != "{")
{
m_targets.push_back(unique_ptr<Target>(new Dough(m_token)));
return new InnerState(*(m_targets.back()), this);
}
könnte
if(m_token != "{")
return new InnerState(*(m_targets.push_back(unique_ptr<Target>(new Dough(m_token)))), this);
reduziert werden, wenn ich std::list::push_back
gibt einen Verweis auf das hinzugefügte Element übernehmen. Der Code ist ein bisschen schwer, aber das ist meistens (zwei Sätze von Klammern) aufgrund unique_ptr
's Konstruktor und Dereferenzierung es. Vielleicht aus Gründen der Übersichtlichkeit eine Version ohne Zeiger:
if(m_token != "{")
{
m_targets.push_back(Dough(m_token));
return new InnerState(m_targets.back(), this);
}
gegen
if(m_token != "{")
return new InnerState(m_targets.push_back(Dough(m_token)), this);
Wow. Tolle Infos, danke! Ich frage mich immer noch, warum sie natürlich keinen Iterator zurückgegeben haben :). Vielleicht weil du dann 'MyClass bar = * (myvector.push_back (functionReturningMyClass()));' haben könntest und wahrscheinlich das gleiche Problem hast wie beim Zurückgeben einer Referenz (oder nicht?). – rubenvb
Ich vermute, der Grund waren Leistungsprobleme, da diese Sache die Konstruktion eines Iterators erfordern würde, und das Kopieren dieses Iterators, und das ist ziemlich viel Aufwand, wenn der Rückgabewert nicht verwendet wird. – smerlin
würde kein vernünftiger Compiler so etwas optimieren? Wahrscheinlich nicht, was das Standardkomitee anschaute :) – rubenvb