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

xml*_*lmx 5 c++ standards concept range-v3 c++20

#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
}
Run Code Online (Sandbox Code Playgroud)

static_assert错误消息:

要使用view :: for_each,函数F必须返回InputRange概念的模型.

std::for_each需要一个返回的仿函数void,为什么ranges::view::for_each要求仿函数必须返回一个InputRange概念模型?

lll*_*lll 7

你误解了什么view::for_each(),它完全不同于std::for_each.

仿函数view::for_each()应该返回另一个范围,然后最终的效果是所有范围都被展平到一个很大的范围.

例如:

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

为每一个元件返回的范围是{0},{0, 1},{0, 1, 2}分别.的res将被压平的一个:{0, 0, 1, 0, 1, 2}

对应的std::for_eachranges::for_each:

ranges::for_each(coll, [] (auto) {})
Run Code Online (Sandbox Code Playgroud)