Является ли неопределенным поведением прямое удаление элементов из базового диапазона filter_view?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Является ли неопределенным поведением прямое удаление элементов из базового диапазона filter_view?

Сообщение Anonymous »

Для следующего кода:

Код: Выделить всё

void foo(std::set& s) {
for (int val : s | std::views::filter([](int i) { return i > 0; })) {
s.erase(val - 3);
}
}
Этот код не предназначен для выполнения какой-либо значимой задачи; это только для иллюстративных целей. Здесь я использую адаптер диапазона std::views::filter, чтобы отфильтровать все положительные числа из s и удалить соответствующие элементы val - 3.
Этот код включает в себя удаление элементов из контейнера во время итерации по нему. Для std::set удаление элемента не делает недействительными итераторы, кроме тех, которые указывают на стертый элемент. Следовательно, если я преобразую приведенный выше код в эквивалентную форму итератора, он не должен включать неопределенное поведение:

Код: Выделить всё

void bar(std::set& s) {
for (int val : s) {
if (val > 0) {
s.erase(val - 3);
}
}
}
Однако я не уверен, что foo содержит неопределенное поведение, поскольку стандарт накладывает дополнительные семантические ограничения на некоторые понятия в библиотеке диапазонов, например требование равенства выражений. сохранение. Я не уверен, что foo нарушает эти семантические требования.
Кроме того, range.filter.iterator явно позволяет изменять базовые элементы с помощью итераторов из filter_view до тех пор, пока поскольку измененные элементы по-прежнему удовлетворяют предикату. Но стандарт не определяет, что происходит при прямом изменении базового диапазона, как в foo.
Является ли поведение foo неопределенным из-за этих изменений или это безопасно? согласно текущему стандарту C++?

Подробнее здесь: https://stackoverflow.com/questions/786 ... ng-range-o
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»