Comparaison des itérateurs de différents conteneurs : clarification du comportement non défini
Lorsque vous travaillez avec des itérateurs en C , il est important de comprendre les limites de la comparaison des itérateurs de différents conteneurs. Cet article examine la question de savoir si l'expression foo.begin() == bar.begin() génère un comportement faux ou indéfini, où foo et bar sont deux conteneurs std::vector distincts.
Selon le Norme C 11 (n3337), les itérateurs de différents conteneurs ne peuvent pas être directement comparés. La section 24.2.5 indique que le domaine de l'opérateur d'égalité == pour les itérateurs directs n'est défini que pour les itérateurs sur la même séquence sous-jacente. Étant donné que différents conteneurs sont considérés comme des séquences distinctes, comparer leurs itérateurs est un comportement non défini.
De plus, le numéro 446 de LWG répond spécifiquement à cette question. La proposition vise à ajouter un texte explicite à la norme clarifiant que la comparaison d'itérateurs de différentes plages, sauf définition contraire explicite, n'est pas définie. Cela souligne que même la comparaison indirecte d'itérateurs de plages distinctes, par exemple en utilisant des fonctions telles que std::find, peut entraîner un comportement indéfini.
Par conséquent, il est essentiel d'éviter de comparer des itérateurs de différents conteneurs ou sous-plages de différents conteneurs. Cela pourrait conduire à des résultats imprévisibles et devrait être évité dans le cadre de pratiques de code robustes.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3