К сожалению, вы не можете передать временный диапазон в алгоритмы диапазонов.
Это потому, что они вернут итератор диапазонов (возможно, ranges::end(rng)
) после завершения. Если вы передадите временное значение, возвращенный итератор будет недействительным;ссылка на временный. Библиотека диапазонов обнаруживает это и возвращает фиктивный страж, ranges::dangling
вместо итератора.
Правильный способ сделать это - сначала составить отфильтрованный диапазон , а затем вызвать алгоритм.
std::vector<int> vals {1, 2, 3, 4, 5};
auto even_vals = vals | filter([](int val){return val % 2 == 0;});
auto minVal = min_element(even_vals);
if (minVal == even_vals.end())
std::cout << "no values\n";
else
std::cout << *minVal; // prints "2"