ABu Asked: 2023-11-28 01:52:48 +0800 CST2023-11-28 01:52:48 +0800 CST 2023-11-28 01:52:48 +0800 CST 在 C++20 中,前向范围的哨兵类型是否保证与其迭代器的类型相同? 772 前向范围r要求其迭代器又是前向迭代器,而前向迭代器又要求迭代器充当其自己的哨兵。但是,这是否意味着实际的哨兵类型(例如,返回的类型r.end())与迭代器本身的类型相同或不同? c++ 2 个回答 Voted Best Answer Ted Lyngmo 2023-11-28T02:03:07+08:002023-11-28T02:03:07+08:00 不,它不是,但它必须是 __WeaklyEqualityComparableWith(仅说明concept)返回的迭代器类型,begin()如可以在其中看到的,这是一个概念......std::sentinel_for concept input_or_output_iterator指定类型与semiregular值表示范围的类型之间的关系。仅供说明的概念__WeaklyEqualityComparableWith在 中进行了描述equality_comparable。 这个sentinel_for概念的使用std::ranges:end()可以在它的调用签名中看到: template< class T > requires /* see link */ constexpr std::sentinel_for<ranges::iterator_t<T>> auto end( T&& t ); 这条注释sentinel_for也很有趣: 哨兵类型及其对应的迭代器类型不需要建模equality_comparable_with,因为哨兵类型可能无法与其自身进行比较,并且它们不需要具有共同的引用类型。 Nicol Bolas 2023-11-28T03:52:00+08:002023-11-28T03:52:00+08:00 基本范围类型概念(输入、前向、双向等)都不要求哨兵是迭代器。即使 a 也contiguous_range可以使用哨兵而不是迭代器。然而,这个概念common_range确实如此。因此,您可以将该概念与基本范围概念之一结合起来。 但是,只有当您确实需要将结束标记作为迭代器进行操作时,才应该使用它。对于严格的前射范围来说,这实际上是不可能的。您不能取消引用它,因为取消引用结束迭代器是不好的。你不能减少它,因为它是一个向前的范围;它的迭代器不能向后走。 基本上,模板没有理由需要 aforward_range也要求它是common_range.
不,它不是,但它必须是
__WeaklyEqualityComparableWith
(仅说明concept
)返回的迭代器类型,begin()
如可以在其中看到的,这是一个概念......std::sentinel_for
concept
这个
sentinel_for
概念的使用std::ranges:end()
可以在它的调用签名中看到:这条注释
sentinel_for
也很有趣:基本范围类型概念(输入、前向、双向等)都不要求哨兵是迭代器。即使 a 也
contiguous_range
可以使用哨兵而不是迭代器。然而,这个概念common_range
确实如此。因此,您可以将该概念与基本范围概念之一结合起来。但是,只有当您确实需要将结束标记作为迭代器进行操作时,才应该使用它。对于严格的前射范围来说,这实际上是不可能的。您不能取消引用它,因为取消引用结束迭代器是不好的。你不能减少它,因为它是一个向前的范围;它的迭代器不能向后走。
基本上,模板没有理由需要 a
forward_range
也要求它是common_range
.