transform_view of ref_view cannot be piped?

Viewed 188

In the following code,

std::vector<int> vectors[] = {{1, 2, 3}, {4, 5}};
auto view = vectors | std::views::transform([](auto v) { return v; })
                    | std::views::join;

why the result of the first pipe is not a range adaptor closure and cannot be passed to a subsequent pipe?

The error snippet:

error: no match for 'operator|' (operand types are 'std::ranges::transform_view<std::ranges::ref_view<const std::vector<int> [2]>, run()::<lambda(auto:27)> >' and 'const std::ranges::views::_Join')
  147 |   auto view = vectors | std::views::transform([](auto v) { return v; }) | std::views::join;
      |               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~
      |                       |                                                               |
      |                       |                                                               const std::ranges::views::_Join
      |                       std::ranges::transform_view<std::ranges::ref_view<const std::vector<int> [2]>, run()::<lambda(auto:27)> >
...
note:   'std::ranges::views::__adaptor::_RangeAdaptorClosure' is not a base of 'std::ranges::transform_view<std::ranges::ref_view<const std::vector<int> [2]>, run()::<lambda(auto:27)> >'
   67 |     concept derived_from = __is_base_of(_Base, _Derived)
      |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...
0 Answers
Related