Стирает ли элемент после 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()) является действительным.

Другие вопросы по тегам