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

为何C++23的zip_view不支持output_range?

C++23 zip_view 为何不支持 output_range?

我注意到C++23中的zip_view有如下约束:

template<input_range... Views>
  requires (view<Views> && ...) && (sizeof...(Views) > 0)
class zip_view;

这意味着zip_view仅能对input_range进行zip操作。

我想知道它为何排除了output_range的支持——在我看来支持output_range会很实用。比如可以将多个output_range zip起来实现同时写入,示例场景如下:

/* 被zip的input_range */
auto zip_in = views::zip(views::iota(0, 3),
                         views::iota(3, 6),
                         views::iota(6, 9));

std::vector<int> v1, v2, v3;
auto make_insert_range = [](auto inserter) {
  return ranges::subrange(inserter, std::unreachable_sentinel);
};
/* 被zip的output_range */
auto zip_out = views::zip(make_insert_range(std::back_inserter(v1)),
                          make_insert_range(std::back_inserter(v2)),
                          make_insert_range(std::back_inserter(v3)));

/* 复制操作 */
ranges::copy(zip_in, zip_out.begin());
std::println("v1: {}", v1); // 输出 v1: [0, 1, 2]
std::println("v2: {}", v2); // 输出 v2: [3, 4, 5]
std::println("v3: {}", v3); // 输出 v3: [6, 7, 8]

不过当前编译器会因为不满足约束而拒绝zip_out的定义。

我认为这在技术上是可行的,尽管会引发一些棘手问题,比如同时zip input_range和output_range时,对应的迭代器应该属于什么类别?我的想法是可以不提供iterator_concept,让zip_view仅作为普通range。

由于在原始提案P2321和range/v3中都没找到关于支持output_range的讨论,我想了解zip_view从一开始就不支持output_range的原因,这是否属于不合理的选择?


内容的提问来源于stack exchange,提问作者康桓瑋

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:11:23