为何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,提问作者康桓瑋
相关产品推荐
相关产品推荐

