Ещё один вопрос по диапазонам. Надеюсь после моей лекции все устыдились и ответы будут обстоятельными и интересными.



Есть код:



struct S { int x, y; };

std::vector<S> v{{1, 0}, {2, 0}, {4, 0}};

auto it = ranges::find(v | views::transform(std::mem_fn(&S::x)), 4).base();



Что тут происходит: я проецирую вектор на инты, ищу там 4 и прошу итератор (base) на исходный вектор.



https://godbolt.org/z/hhWaPsjsj



Он не работает, но GCC и ToT Clang говорят разные вещи.



У clang там просто ranges::dangling (хотя как может провиснуть итератор на существующий вектор?)

У gcc там нечто более интересное.



Опять таки исходный библиотечный код один и тот же. Как бы вы это исследовали? Кто тут прав?



#questions