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

时间:2018-11-17 00:46:31

标签: c++ standards concept c++20 range-v3

#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错误消息:

  

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

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

1 个答案:

答案 0 :(得分:6)

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

view::for_each()中的函子应返回另一个范围,然后最终效果是将所有范围展平为一个大范围。

例如:

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

每个元素的返回范围分别为{0}{0, 1}{0, 1, 2}res将被展平:{0, 0, 1, 0, 1, 2}

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

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