c++ - [ranges.subrange] 中的 `iterator-sentinel-pair` 概念的目的是什么?
问题描述
[range.subrange]iterator-sentinel-pair
中定义的仅展示概念的目的是什么?
template<class T>
concept iterator-sentinel-pair = // exposition only
!range<T> && pair-like<T> &&
sentinel_for<tuple_element_t<1, T>, tuple_element_t<0, T>>;
据我所知,它唯一一次用于 CTAD,例如
template<iterator-sentinel-pair P>
subrange(P) -> subrange<tuple_element_t<0, P>, tuple_element_t<1, P>>;
但是,没有任何构造函数std::ranges::subrange
可以使用这个概念:唯一可能适合这个参数列表的真正构造函数是这个:
template<not-same-as<subrange> R>
requires borrowed_range<R> &&
convertible-to-non-slicing<iterator_t<R>, I> &&
convertible_to<sentinel_t<R>, S>
constexpr subrange(R&& r) requires (!StoreSize || sized_range<R>);
这需要(通过borrowed_range<R>
)我们有range<R>
......但iterator-sentinel-pair
明确要求not range<R>
!
在我看来,其目的是允许代码类似于
std::multiset foo = // ...
auto result = foo.equal_range(key); // an iterator-sentinel pair
for (auto value : std::ranges::subrange(result)) {
// ...
}
但这显然不会编译,因为std::pair<It, It>
不满足std::range
. 也许允许这个用例的构造函数被忽略了?
我还有其他目的吗?
解决方案
[range.subrange] 中定义的仅展示迭代器-哨兵-对概念的目的是什么?
不再有任何意义,它们在上一次全体会议通过的LWG 3404中被删除,并且很快就会从草案中删除。在LWG 3281中删除了所有使用它们的东西之后,它们只是残留的监督。
最初,该概念的目的正是允许这样做:
for (auto value : std::ranges::subrange(foo.equal_range(key))) {
// ...
}
但是基于以下推理消除了隐含性:
仅仅因为一对持有两个迭代器,并不意味着这两个迭代器表示一个有效范围。将这种类似对的类型隐式转换为子范围是危险的,应该被禁止。
尽管至少进行显式转换似乎很有用。值得庆幸的是,我们自己写起来很简单:
template <typename P>
requires (std::tuple_size_v<P> == 2)
&& std::ranges::sentinel_for<std::tuple_element_t<1, P>,
std::tuple_element_t<0, P>>
auto make_subrange_from_pair(P pair) {
// either this
auto [b, e] = pair;
return subrange(b, e);
// or that
return subrange(std::get<0>(pair), std::get<1>(pair));
}
推荐阅读
- git - `git branch -M` 对单个参数有什么作用?
- sbt - 无法在 Grafana Cloud 中查看 JMX prometheus javaagent 导出器指标
- javascript - 轻量级图表不显示在 html 页面上
- python - 如何使用 Boto3 在 S3 中保存 EMR 集群日志?
- powerquery - 如何修复 Power Query 多个工作簿标题显示为行?
- java - java有堆数据结构吗?
- ruby-on-rails - Docker Compose 中的 ElasticSearch
- spring-boot - 集群环境中的 imap-idle-channel-adapter
- reactjs - React 状态变量可用性
- ios - 使用 Geolocator 方法无法打开 HERE 地图 - Flutter