Comparaison d'itérateurs de différents conteneurs : clarification d'un 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 indéfini.
De plus, le numéro 446 du 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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!