【发布时间】:2019-02-25 09:15:21
【问题描述】:
#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
}
问题如上面的代码所示。我用ranges-v3-0.3.7。
对我来说,通用算法copy 不应该关心目标迭代器类型,只要它满足输出迭代器的要求。
如果是这样,为什么范围的算法与 std 的迭代器不兼容?
【问题讨论】:
-
主要是因为范围支持是实验性的,还不是标准的,所以
std::ostream_iterator的设计没有任何范围支持。重点是证明将这种支持正式引入未来标准的可行性,而不是锁定完整的规范。据推测,如果在标准的未来版本中引入范围,ranges::ostream_iterator的规范将成为 @ 规范的一部分987654327@ 和ranges::copy()将成为std::copy()规范的一部分,并且将解决任何不兼容问题。 -
彼得的回答不太准确。
ranges::copy有意要求其输出迭代器是默认可构造的。而ranges::copy将保留ranges::copy(准确地说是std::ranges::copy)并且不会与std::copy合并。请参阅下面的 Barry 的回答。 -
@EricNiebler:
ranges::copy是否需要默认构造其输出迭代器? (为什么?)如果不是,这似乎是不必要的不兼容...... -
你用 C++20 试过了吗,en.cppreference.com/w/cpp/iterator/ostream_iterator/… 说
std::ostream_iterator是默认可构造的,这意味着从讨论中,它可以工作。 -
@Nemo,我有这种感觉,范围总是要求比它需要的更多。我也问自己,为什么复制需要迭代器的默认构造?也许这意味着我没有正确考虑这个问题。也许是迭代器是正确的值类型的全面要求,因此特别是默认可构造的。但是对于任何特定的算法,似乎总是潜伏着一个较弱的概念。我曾经对语法上需要默认构造的算法进行了一次实证调查:我在 STL 中只能找到 2 个,而且它们在实现中似乎是无偿的
标签: c++ iterator c++-concepts c++20 range-v3