为什么 std::filter_view 没有办法急切地评估它并将其转换为以 const 开头的视图?

Why does std::filter_view not have a way to eagerly evaluate it and convert it to view whose begin in const?

filter_view 有一个常量开头。

但我想知道为什么它上面没有成员或自由函数 return some_filter_view 类型与 filter_view 相同,只是它有一个 const begin ().显然这个方法是 O(n),但它会很好,因为它在代码中是显式的。

仅仅是标准化工作量太大/编译速度过慢,还是有其他原因?

我想要的基本示例:

void fn(){
    std::array<int,5> arr{1,2,3,4,5};
    const auto filtered = arr | std::views::filter([](auto){return true;});
    filtered.begin(); // does not compile
    // --would be nice if we could do 
    // const auto filtered = arr | std::views::filter([](auto){return true;}) | eval_begin;
    // --now filtered.begin() can be called
}

这基本上是“为什么我们不能 filter_view 在构建时缓存”。

答案是它会复制 O(N) 因为缓存的迭代器是原始视图的迭代器,所以你复制的视图必须再次找到 begin() 来获得它的副本。

如果您已经有一个(非 const)filter_view,那么用 subrange 从中创建一个 const-iterable 视图就很简单了。很明显,这需要 filter_viewsubrange 保持活动状态时保持活动状态。