根据(优秀)问题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效率,简单性)还在观察现有的要求吗?
答案 0 :(得分:2)
这个问题在2004年被提出为defect 485,n3066中的措辞澄清了这个问题,要求输出迭代器只需要支持一系列交替增量和解除引用/赋值。因此,在您的示例中,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_iterator
上this question,其中忽略此类(无效)双增量,只返回*this
;只有取消引用/分配才会使ostream_iterator
实际增加。