#include <vector>
#include <iostream>
#include <range/v3/all.hpp>
int main()
{
auto coll = std::vector{ 1, 2, 3 };
ranges::copy(
coll,
ranges::ostream_iterator<int>{ std::cout, ", " }
); // ok
ranges::copy(
coll,
std::ostream_iterator<int>{ std::cout, ", " }
); // error
}
Run Code Online (Sandbox Code Playgroud)
问题显示在上面的代码中.我使用range-v3-0.3.7.
对我来说,通用算法copy不应该关心目标迭代器类型,只要它满足输出迭代器的要求即可.
如果是这样,为什么范围的算法不与std的迭代器兼容?
在 C++20 中,我们得到了迭代器类别的概念,例如std::forward_iterator对应于命名需求ForwardIterator。
它们并不等同。在某些(但不是全部)方面,这些概念较弱:
(1) “与 [ForwardIterator 或更严格的] 要求不同,[相应的] 概念不需要取消引用来返回左值。”
(2)
“与 [InputIterator] 要求不同,该input_iterator概念不需要equality_comparable,因为输入迭代器通常与哨兵进行比较。”
...
新std::ranges算法似乎使用这些概念来检查迭代器要求。
但是其他标准算法呢?(C++20 之前就已存在)
他们在 C++20 中是否仍使用与 C++20 之前相同的迭代器要求,或者对它们的要求是否放宽以匹配概念?