ericniebler / range-v3

Range library for C++14/17/20, basis for C++20's std::ranges
Other
4.05k stars 437 forks source link

MSVC v19.36 `filter` no longer compatible with `std::optional` #1785

Closed tom-huntington closed 1 year ago

tom-huntington commented 1 year ago

In v19.35 you could pass an invocable to ranges::views::filter that returned std::optional. In v19.36 you cant:

https://godbolt.org/z/jcfjE3var

auto input = std::vector<std::optional<int>>{};
#if 1
// broken v19.36, works prior
    input | ranges::views::filter([](auto pair) -> std::optional<int> { return pair; });
#else 
// works
    input | ranges::views::filter([](auto pair) -> bool { return pair; });
#endif
tom-huntington commented 1 year ago

It seems that ranges::predicate wasn't working properly prior to v19.36 https://godbolt.org/z/7qcs9Yrx3

https://stackoverflow.com/a/76423911/11998382

It's fixed now. So perhaps this was undefined behaviour all along.