Недавно я смотрел выступление Нико Джосуттиса 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;, то есть до этого?
Я имею в виду, что компилятор видит, что в колле есть хотя бы один элемент, который удовлетворяет isEven, а это означает, что если b истинно< /code> и цикл for будет запущен, ++i будет запущен, что приведет к UB. Следовательно, компилятор может с радостью заключить, что bar() должен возвращать false.
Является ли такое «рассуждение» совершенно невозможным для компилятора?
Подробнее здесь:
https://stackoverflow.com/questions/786 ... s-only-not