Код: Выделить всё
void foo(std::set& s) {
for (int val : s | std::views::filter([](int i) { return i > 0; })) {
s.erase(val - 3);
}
}
Этот код включает в себя удаление элементов из контейнера во время итерации по нему. Для std::set удаление элемента не делает недействительными итераторы, кроме тех, которые указывают на стертый элемент. Следовательно, если я преобразую приведенный выше код в эквивалентную форму итератора, он не должен включать неопределенное поведение:
Код: Выделить всё
void bar(std::set& s) {
for (int val : s) {
if (val > 0) {
s.erase(val - 3);
}
}
}
Кроме того, range.filter.iterator явно позволяет изменять базовые элементы с помощью итераторов из filter_view до тех пор, пока поскольку измененные элементы по-прежнему удовлетворяют предикату. Но стандарт не определяет, что происходит при прямом изменении базового диапазона, как в foo.
Является ли поведение foo неопределенным из-за этих изменений или это безопасно? согласно текущему стандарту C++?
Подробнее здесь: https://stackoverflow.com/questions/786 ... ng-range-o