为什么 `ranges::view::for_each` 要求函子必须 return `InputRange` 概念的模型?

Why does `ranges::view::for_each` require the functor must return a model of the `InputRange` concept?

#include <vector>
#include <algorithm>
#include <range/v3/all.hpp>

using namespace ranges;

int main()
{
    auto coll = std::vector{ 1, 2, 3 };
    std::for_each(coll.begin(), coll.end(), [](auto){}); // ok
    coll | view::for_each([](auto){}); // static_assert failure
}

static_assert错误信息:

To use view::for_each, the function F must return a model of the InputRange concept.

std::for_each 接受了一个 returns void 的函子,为什么 ranges::view::for_each 要求函子必须 return [=17= 的模型]概念?

你误解了什么是view::for_each(),它和std::for_each完全不同。

view::for_each()中的函子应该return另一个范围,那么最后的效果就是把所有的范围拉平成一个大范围

例如:

auto res = coll | view::for_each([](auto n){ return yield_from(view::ints(0, n)); });

每个元素的 returned 范围分别是 {0}{0, 1}{0, 1, 2}res 将是扁平化的:{0, 0, 1, 0, 1, 2}

std::for_each的对应词是ranges::for_each:

ranges::for_each(coll, [] (auto) {})