下面的代码编译得很好,用 v1
中的值覆盖了 v2
中的值:
std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2 = {6, 7, 8, 9, 10};
std::copy(v1.begin(), v1.end(), v2.begin());
std::copy
的第三个参数是一个 OutputIterator。但是,Container 要求指定 a.begin()
(其中 a
是一个 Container 对象)应该具有 iterator
的返回类型,即定义为:
any iterator category that meets the forward iterator requirements.
前向迭代器要求不包括输出迭代器要求,所以上面的例子是未定义的吗?我将迭代器用作输出迭代器,尽管没有明显的保证它将是一个。
不过,我相当确定上面的代码是有效的,所以我的猜测是您可以从有关容器的详细信息中推断出 begin()
返回的正向迭代器实际上也支持输出迭代器要求。在这种情况下,begin()
不 何时返回输出迭代器?仅当容器为const
时还是有其他情况?
最佳答案
如果前向迭代器是可变的,则前向迭代器可以符合输出迭代器的规范,具体取决于序列的类型。它没有明确说明(不像他们输入迭代器要求的事实),但如果我们看一下要求表
我们可以去检查给定的前向迭代器是否符合它们:
*r = o
(§24.2.5/1)
: ifX
is a mutable iterator,reference
is a reference toT
可变引用是可分配的(除非你有一个不可分配的类型,显然)。
++r
,r++
,*r++ = o
(§24.2.5 Table 109)
表 109 中的第一行与输出迭代器的要求相同,只是前向迭代器没有注释。第二行比输出迭代器更严格,因为它指定必须返回一个reference
。
底线,如果您有一个可变的前向迭代器到一系列可复制分配的类型中,您就有一个有效的输出迭代器。
(从技术上讲,一个包含 operator=(...) const
和可变成员的类型序列的常量迭代器也符合条件,但我们希望没有人这样做。)
关于c++ - 容器迭代器是否未定义常规覆盖复制模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608360/