Comparing Iterators from Different Containers: Clarifying Undefined Behavior
When working with iterators in C , it's important to understand the limitations of comparing iterators from different containers. This article delves into the question of whether the expression foo.begin() == bar.begin() yields false or undefined behavior, where foo and bar are two separate std::vector containers.
According to the C 11 standard (n3337), iterators from different containers cannot be directly compared. Section 24.2.5 states that the domain of the equality operator == for forward iterators is only defined for iterators over the same underlying sequence. Since different containers are considered separate sequences, comparing iterators from them is undefined behavior.
Furthermore, LWG issue #446 specifically addresses this question. The proposal aims to add explicit text to the standard clarifying that comparing iterators from different ranges, unless explicitly defined otherwise, is undefined. This emphasizes that even indirectly comparing iterators from distinct ranges, such as using functions like std::find, can result in undefined behavior.
Therefore, it's essential to avoid comparing iterators from different containers or subranges of different containers. Doing so could lead to unpredictable results and should be avoided in robust code practices.
The above is the detailed content of Is Comparing Iterators from Different Containers Undefined Behavior?. For more information, please follow other related articles on the PHP Chinese website!