是否为Container迭代器定义了常规覆盖复制模式?

Jos*_*eld 3 c++ containers iterator c++11

下面的代码编译就好了,覆盖的值v2与来自v1:

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());
Run Code Online (Sandbox Code Playgroud)

第三个参数std::copy是OutputIterator.然而,容器的要求指定a.begin(),其中a是容器对象,应该有一个返回类型iterator,其定义为:

任何满足前向迭代器要求的迭代器类别.

前向迭代器要求不包括输出迭代器的要求,因此上面的示例是未定义的吗?我使用迭代器作为输出迭代器,即使没有明显的保证它将是一个.

我相当肯定上面的代码是有效的,所以我的猜测是你可以从有关容器的细节推断出前进迭代器返回的begin()实际上也会支持输出迭代器的要求.在那种情况下,什么时候begin() 返回输出迭代器?只有当容器const处于或有其他情况时?

Xeo*_*Xeo 8

正向迭代器可以符合输出迭代器的规范(如果它们是可变的),具体取决于序列的类型.它没有明确说明(不像它们输入迭代器要求的事实),但如果我们看一下需求表

输出迭代器要求

我们可以去检查给定的前向迭代器是否符合它们:

*r = o
(§24.2.5/1):if X是一个可变的迭代器,reference是一个引用T

可变引用是可分配的(除非你有一个不可分配的类型,显然).

++r,r++,*r++ = o
(§24.2.5 Table 109) 转发迭代器要求

表109中的第一行与输出迭代器的要求相同,只是前向迭代器没有备注.第二行比输出迭代器更具限制性,因为它指定reference必须返回a.

最重要的是,如果你有一个可变的前向迭代器到一系列可复制的类型,你就有了一个有效的输出迭代器.

(从技术上讲,具有operator=(...) const可变成员的类型序列中的常量迭代器也符合条件,但我们希望没有人能做到这样的事情.)