Я считаю, что это неопределенное поведение (C ++ 03).std::vector
итераторы являются итераторами с произвольным доступом, и поведение ==
определено в требованиях для прямых итераторов.
== является отношением эквивалентности
Обратите внимание, чтоэто требование к типу, поэтому оно должно применяться (в данном случае) к любой паре действительных (разыменовываемых или иных) std::vector::iterator
s.Я считаю, что это означает, что ==
должен дать вам ответ true
/ false
и не может вызвать UB.
- Если a и b равны, то либо a, либо bоба - разыменовываемые или иначе - разыменовываемые.
И наоборот, разыменовываемый итератор не может сравниваться равным итератору, который не может быть разыменован.
- Если a и b оба разыменовываются, тогда a == b, если и только если * a и * b - это один и тот же объект.
Обратите внимание на отсутствие требования о a == b
для двух итераторов, которые не могут быть разыменованы.Пока ==
является транзитивным (если a.end() == b.end()
и b.end() == c.end()
, тогда a.end() == c.end()
), рефлексивным (a.end() == a.end()
) и симметричным (если a.end() == b.end()
, то b.end() == a.end()
), не имеет значения, если некоторые, всеили нет end()
итераторов для разных контейнеров, сравниваемых равными.
Обратите также внимание, что это в отличие от <
.<
определяется в терминах b - a
, где a
и b
являются итераторами произвольного доступа.Предварительное условие выполнения b - a
заключается в том, что должно быть значение Distance
n
, такое, что a + n == b
, для которого требуется a
и b
, должны быть итераторами в одном диапазоне.