Стирает ли элемент после before_begin() определенный в пустом std::forward_list?
Имеет ли этот код определенное поведение в стандартной библиотеке C++?
std::forward_list<T> list;
list.erase_after(list.before_begin());
Интуиция сказала бы "нет", но я не смог найти точную формулировку стандартов для этого конкретного случая.
1 ответ
Решение
Предварительное условие на erase_after
является:
iterator erase_after(const_iterator position);
Требуется: следующий итератор
position
разыменовывается
Так что ваш пример имеет неопределенное поведение, потому что list
пусто, так list.before_begin()
не может быть увеличен, поэтому за ним нет итератора.
Если в списке есть хотя бы один элемент, то list.erase_after(list.before_begin())
является действительным.