Lorsque je regardais les fonctions membres des conteneurs STL, une idée étrange m'est venue à l'esprit. Pourquoi des fonctions comme std::vector<T>::push_back(T)
n'ont-elles pas une valeur de retour (optionnelle) (itérateur ou même une référence à l'objet ajouté)? Je connais std::string
fonctions comme insert
et erase
retour itérateurs, mais c'est pour des raisons évidentes. Je pense qu'il serait souvent enregistrer une deuxième ligne de code qui suit souvent ces appels de fonction.Valeurs de retour de la fonction de conteneur STL
Je suis sûr que les concepteurs de C++ ont une très bonne raison, s'il vous plaît me éclairer :)
MISE À JOUR: Je suis notamment un exemple de code dans le monde réel ici où il pourrait réduire la longueur de code:
if(m_token != "{")
{
m_targets.push_back(unique_ptr<Target>(new Dough(m_token)));
return new InnerState(*(m_targets.back()), this);
}
pourrait être réduite à
if(m_token != "{")
return new InnerState(*(m_targets.push_back(unique_ptr<Target>(new Dough(m_token)))), this);
Si je suppose std::list::push_back
renvoie une référence à l'élément ajouté. Le code est un peu lourd, mais c'est principalement (deux ensembles de parenthèses) dû au constructeur de unique_ptr
et le déréférencement. Peut-être pour plus de clarté une version sans pointeurs:
if(m_token != "{")
{
m_targets.push_back(Dough(m_token));
return new InnerState(m_targets.back(), this);
}
contre
if(m_token != "{")
return new InnerState(m_targets.push_back(Dough(m_token)), this);
Wow. Bonne info, merci! Reste à me demander pourquoi ils n'ont pas retourné un itérateur bien sûr :). Peut-être parce que vous pourriez alors 'MyClass bar = * (myvector.push_back (functionReturningMyClass()))' et probablement avoir le même problème que pour retourner une référence (ou pas?). – rubenvb
Je suppose, la raison était des problèmes de performance, puisque cette chose nécessiterait la construction d'un itérateur, et la copie de cet itérateur, et c'est tout à fait un surcoût, si la valeur de retour n'est pas utilisée. – smerlin
aucun compilateur décent n'optimiserait-il une telle chose? Probablement pas ce que le comité de normalisation regardait :) – rubenvb