You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:20:03