取消引用分配给双倍增量的OutputIterator

时间:2012-08-09 15:47:45

标签: c++ iterator increment language-lawyer post-increment

根据(优秀)问题C++ OutputIterator post-increment requirements,我们观察到r类型OutputIterator的可解除引用且可递增的值X,以及o的值*r++ = o; 适当的类型,表达式

X a(r);
++r;
*a = o;

有效且具有与

等效的语义
a

但是,如果r在中间期间增加了不止一次,那么X a(r); ++r; ++r; *a = o; 是否可以取消引用?也就是说,这段代码有效吗?

InputIterator

很难看出对值的操作如何影响对另一个值的操作的有效性,例如++r(24.2.3)在r

的后置条件下具有
  

任何副本   之前的==值为no   要求更长时间   可以解除引用或进入   OutputIterator的域名。

相关部分: 24.2.2迭代器 24.2.4输出迭代器 17.6.3.1模板参数要求

此外,如果要求有效,是否有任何情况下利用其无效性将有助于{{1}}类型的实现(wrt效率,简单性)还在观察现有的要求吗?

1 个答案:

答案 0 :(得分:2)

这个问题在2004年被提出为defect 485n3066中的措辞澄清了这个问题,要求输出迭代器只需要支持一系列交替增量和解除引用/赋值。因此,在您的示例中,r在第一个++r之后无需递增,除非存在干预取消引用/分配。 SGI STL也要求这种行为(见脚注3)。如上所述,n3225没有修复n3066,因此defect 2035被提出;但唉,修复版没有进入C ++ 11的发布版本(ISO / IEC 14882:2011)。

此外,缺陷2035表示a(来自X a(r++);)不能像*a = 0那样使用:

  

“在此操作之后[ie,++r] r不需要是可递增的,并且前一个值r的任何副本不再需要是可解除引用或可递增的。 “

在某些情况下,这可能有助于实施(就简单性而言):参见例如ostream_iteratorthis question,其中忽略此类(无效)双增量,只返回*this;只有取消引用/分配才会使ostream_iterator实际增加。