Hol*_*Cat 5 c++ language-lawyer c++20
在 C++20 中,我们得到了迭代器类别的概念,例如std::forward_iterator对应于命名需求ForwardIterator。
它们并不等同。在某些(但不是全部)方面,这些概念较弱:
(1) “与 [ForwardIterator 或更严格的] 要求不同,[相应的] 概念不需要取消引用来返回左值。”
(2)
“与 [InputIterator] 要求不同,该input_iterator概念不需要equality_comparable,因为输入迭代器通常与哨兵进行比较。”
...
新std::ranges算法似乎使用这些概念来检查迭代器要求。
但是其他标准算法呢?(C++20 之前就已存在)
他们在 C++20 中是否仍使用与 C++20 之前相同的迭代器要求,或者对它们的要求是否放宽以匹配概念?
\n\n他们在 C++20 中是否仍使用与 C++20 之前相同的迭代器要求,或者对它们的要求是否放宽以匹配概念?
\n
现有std::算法仍然使用指定的要求。例如,[alg.find]具有以下两者:
template<class InputIterator, class T>\n constexpr InputIterator find(InputIterator first, InputIterator last,\n const T& value);\nRun Code Online (Sandbox Code Playgroud)\n和
\ntemplate<input_\xc2\xaditerator I, sentinel_\xc2\xadfor<I> S, class T, class Proj = identity>\n requires indirect_\xc2\xadbinary_\xc2\xadpredicate<ranges::equal_to, projected<I, Proj>, const T*>\n constexpr I ranges::find(I first, S last, const T& value, Proj proj = {});\ntemplate<input_\xc2\xadrange R, class T, class Proj = identity>\n requires indirect_\xc2\xadbinary_\xc2\xadpredicate<ranges::equal_to, projected<iterator_t<R>, Proj>, const T*>\n constexpr borrowed_iterator_t<R>\n ranges::find(R&& r, const T& value, Proj proj = {});\nRun Code Online (Sandbox Code Playgroud)\n所有算法都是如此。
\n请注意,有一项建议可以更改此设置:范围视图作为非范围算法的输入。该论文将更改指定的要求以使其与 s 保持一致concept(请注意,它不会改变std::以接受哨兵)。