Йа волосат и бородат!

Решил я написать от нечего делать фигню со свистелками и перделками списками и внезапно наткнулся вот на такую радость:


list::rbegin() // Returns an iterator addressing the first element in a reversed list.
list::end() // Returns an iterator that addresses the location succeeding the last element in a list. If the list is empty, then list::end == list::begin.
(c) MSDN

reverse_iterator rbegin()
{ // return iterator for beginning of reversed mutable sequence
return (reverse_iterator(end()));
}
(c) <list>

Остается молиться, что оный rbegin() не используется где-нибудь в шаблонах <algorythm>...


PS: found on MS Visual Studio 2005.


UPD: Порылся в исходниках STL и обнаружил вот такую прелесть:


_RanIt __CLR_OR_THIS_CALL base() const
{ // return wrapped iterator
return (current);
}
reference __CLR_OR_THIS_CALL operator*() const
{ // return designated value
_RanIt _Tmp = current;
return (*--_Tmp);
}
pointer __CLR_OR_THIS_CALL operator->() const
{ // return pointer to class object
return (&**this);
}

То есть, обратный итератор возвращает изображает, будто бы он ссылается на правильный элемент, но при попытке получить обычный итератор вернет не его, а... внезапно итератор, ссылающийся на следующий элемент. Просто прекрасно! :)





@темы: программизм