Этот вопрос лучше всего резюмируется примером кода
int foo() {
const std::vector<int> elems{4, 5, 6, 2, 1, 9, 8};
const auto is_even = [](int e) { return e % 2 == 0; };
const auto cmp = [](int x, int y) { return x < y; };
auto evens = elems | std::views::filter(is_even); // 4 6 2 8
return std::ranges::max(elems, cmp); // 9 ????
}
Каким-то образом, несмотря на запуск max в filter_view, он возвращает элемент, который должен был быть отфильтрован.





... несмотря на бег
maxпоfilter_view...
Вы не бежите max по filter_view. Вы бежите max по vector<int>elems.
elems не зависит от вашего взгляда — и было бы особенно странно, если бы на него не влияло, поскольку elems есть const.
Вам нужно подать заявку max на evens, который является вашим filter_view.
return std::ranges::max(evens, cmp);
... или, поскольку встроенный компаратор для max поступит правильно:
int foo() {
const std::vector<int> elems{4, 5, 6, 2, 1, 9, 8};
const auto is_even = [](int e) { return e % 2 == 0; };
auto evens = elems
| std::views::filter(is_even);
return std::ranges::max(evens); // no cmp needed
}
@Keltek Добро пожаловать в клуб :-) К счастью, SO здесь, чтобы помочь нам, когда мы сходим с рельсов :-)
это дни, когда я понимаю, насколько я на самом деле лишен сна. Спасибо за помощь. Я бы хотел удалить этот вопрос.