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?
Обсуждают сегодня