list<int> foo;
list<int> foo2;
list<int>::iterator foo_end = foo.end();
list<int>::iterator foo2_end = foo2.end();
for (list<int>::iterator it = foo.begin(); it != foo2_end; ++foo) <- notice != comparison here
{
...
cela a-t-il permis? cela fonctionnera-t-il correctement?comparaison de deux itérateurs end()
Je suis enclin à penser que cela dépend de l'implémentation, quelqu'un sait si la norme en dit quelque chose?
Cela dépend de l'implémentation des itérateurs. Une implémentation triviale, et pas vraiment bonne, d'un itérateur de liste pourrait être un pointeur dans le nœud, avec une identification nulle après la fin (qui est un idiome commun) [peut-être un pointeur dans la liste est requis pour une opération], avec l'égalité étant définie comme une comparaison directe des adresses de nœuds référencées. Il n'y a rien dans la norme qui rendrait cette mise en œuvre non conforme. –
Assez juste, même si je suppose que les compilateurs de qualité commerciale seraient un peu plus intelligents à ce sujet.Après tout, rendre les interfaces faciles à utiliser correctement et difficile à utiliser est un bon objectif commun. :) –
@ DavidRodríguez-dribeas "(une) implémentation d'un itérateur de liste pourrait être un pointeur dans le nœud, avec une identification nulle après la fin (qui est un idiome commun)" pourriez-vous citer une telle liste std :: cassée la mise en oeuvre? – curiousguy