Действительно ли это изменение через filiter_view::iterator за один проход не так уж и плохо?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Действительно ли это изменение через filiter_view::iterator за один проход не так уж и плохо?

Сообщение Anonymous »

Недавно я смотрел выступление Нико Джосуттиса Keynote Meeting C++ 2022 и только что закончил читать пост Барри Ревзина на ту же тему.
Это код

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

// increment even elements:
for (int& i : coll | std::views::filter(isEven)) {
++i; // UB: but works
}
Мой вопрос (возможно, для авторов компиляторов), насколько далеко зашло мое воображение, если я думаю, что UB, предписанный [range.filter.iterator]/1, может создать следующий код ,

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

#include 
#include 
#include 

constexpr auto isEven = [](int i){
return i % 2 == 0;
};

bool bar();

bool foo() {
bool b = bar();
std::vector coll{1,2,3,4,5,6,7};
if (b)
for (int& i : coll | std::views::filter(isEven))
++i; // UB: but works
return b;
}
скомпилироваться так, чтобы возвращать false;, то есть до этого?

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

foo():
xor     eax, eax
ret
Я имею в виду, что компилятор видит, что в колле есть хотя бы один элемент, который удовлетворяет isEven, а это означает, что если b истинно< /code> и цикл for будет запущен, ++i будет запущен, что приведет к UB. Следовательно, компилятор может с радостью заключить, что bar() должен возвращать false.
Является ли такое «рассуждение» совершенно невозможным для компилятора?

Подробнее здесь: https://stackoverflow.com/questions/786 ... s-only-not
Ответить

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

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

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

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

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