ranges::any_view工作机制及与cache1配合的异常问题问询
简而言之
我不清楚ranges::any_view<T, C>的工作机制,尤其是参数T的类型(如&、const&、值类型等)带来的影响。¹
调研情况
目前相关资料较少,仅找到一篇解释为何无法对const ranges::any_view调用ranges::begin的有用文章。
疑难案例
以下是一个令我困惑的案例,深入理解其运行逻辑有助于掌握any_view的本质。
如下函数接收任意std::string范围并打印每个元素(filter(always(true))会保留所有元素):
void test(any_view<std::string> parts) { for_each(parts | filter(always(true)), print); };
若传入any_view<std::string const&>类型的左值:
any_view<std::string const&> view{foos};
调用:
test(view);
一切正常,但如果先将其传入cache1²:
test(view | cache1);
所有std::string都会变为空。
我通过试错发现,将函数定义从:
test(any_view<std::string> parts) {
改为:
test(any_view<std::string const&> parts) {
可解决问题,但我不理解原因。
但若同时将:
any_view<std::string const&> view{foos};
改为:
any_view<std::string> view{foos};
会触发SIGSEGV错误。
此外,在调用点手动内联test函数体也可解决问题。
更奇怪的是,将std::string替换为持有std::string且析构时将其设为""的Foo类时,问题似乎消失了。
附带问题
我知道C20中没有any_view,且C23中也不会加入,除了性能原因外,还有什么原因导致它未被纳入标准?是否有其他标准库组件可替代它?
(¹) 我对C的作用较为清楚,比如曾将any_view<SomeType, sized>降级为any_view<SomeType, forward>,以存储不支持sized的filter_view。
(²) 此处cache1并无实际作用,但在我的真实场景中,我使用了view | transform(f) | filter(g),插入cache1是为了避免每个通过g(f(x))测试的元素x被重复调用f。
内容的提问来源于stack exchange,提问作者Enlico

