Итераторы указывают на один и тот же ключ
Нет, они этого не делают.m.end()--;
это пост декремент.Его семантика - уменьшить возвращаемое значение m.end()
как побочный эффект, но вернуть исходное значение без изменений .Так что it1 == m.end()
и вы получите неопределенное поведение, разыменовав его.
Он успешно компилируется из-за нежелательного побочного эффекта operator++
, являющегося функцией-членом определенного пользователем типа (итератор).Вы можете вызвать его даже для r-значения, такого как m.end()
, в то время как встроенный постдекремент ожидает значение l.
Так что, хотя итераторы указатели модели , они нене совсем то же самое.Для сравнения, эта программа:
char* foo();
int main() {
foo()--;
}
выдаст ошибку на foo()--
, поскольку foo()
является указателем r-значения, и мы не можем уменьшить его.