vector::const_iterator возвращает can't dereference out of range iterator. Тип ptr vector<char>::const_iterator. Сам ptr указывает как бы end(), на мусор короче и аналогичный декремент такого же итератора на простейшем примере корректен.
if (!BelongsToBuffer(ptr - 1)) {
--ptr; //Trouble
}
STL:
_Vector_const_iterator& operator--()
{ // predecrement
#if _ITERATOR_DEBUG_LEVEL != 0
const auto _Mycont = static_cast<const _Myvec *>(this->_Getcont());
STL_VERIFY(_Ptr, "can't decrement value-initialized vector iterator");
STL_VERIFY(_Mycont->_Myfirst < _Ptr, "can't decrement vector iterator before begin");
#endif /* _ITERATOR_DEBUG_LEVEL != 0 */
--_Ptr; //теперь _Ptr корректно указывает на 'h' )
return (*this); //can't dereference out of range iterator, на, что влияет здесь на out of range?
}
Но если сделать так:
if (!BelongsToBuffer(ptr - 1)) {
ptr -= 1; //Ok
auto like_ret = *(&ptr); //Даже если так сымитировать return *(this) у operator-- всё ок
*ptr; //И даже так ок.
(*this); //И даже так (работаем в классе итератора).
}
`Не могу понять что это, что случается с ним когда он в руки operator-- попадает, что это страшное *(this) такого делает?
Точно не инвалиднутый энд?
Как ты понимаешь, корректен ли итератор? Я к тому, что ты неправильно диагносцируешь ситуацию.
вот предположим, что у тебя пустой контейнер, что будет если ты у end() сделаешь -1 ?!
return (*this); //can't dereference out of range iterator, на, что влияет здесь на out of range? Эта строка не может быть "can't dereference out of range iterator" потому что в ней нет "iterator dereference"
А зачем ты залез в исходники stl от msvc?
Обсуждают сегодня