Большинство erase()
реализаций, которые я видел, возвращают следующий итератор в последовательности именно для такой ситуации, например:
std::list<int>::reverse_iterator it = list.rbegin();
while( it != list.rend() )
{
int value = *it;
if( some_cond_met_on(value) )
{
it = list.erase( it );
}
else
{
++it;
}
}