Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对双增量输出迭代器的解引用赋值_C++_Iterator_Increment_Language Lawyer_Post Increment - Fatal编程技术网

C++ 对双增量输出迭代器的解引用赋值

C++ 对双增量输出迭代器的解引用赋值,c++,iterator,increment,language-lawyer,post-increment,C++,Iterator,Increment,Language Lawyer,Post Increment,根据(优秀)问题,我们观察到,对于outputieratortypeX的可取消引用和可增加的值r,以及适当类型的值o,表达式 *r++ = o; 是有效的,并且具有与 X a(r); ++r; *a = o; 然而,如果r在中间期间增加了不止一次,那么a仍然是可解引用分配的;也就是说,这个代码有效吗 X a(r); ++r; ++r; *a = o; 很难看出对一个值的操作如何影响对另一个值的操作的有效性,但例如,inputierator(24.2.3)在++r的后置条件下: 有没有 r的

根据(优秀)问题,我们观察到,对于
outputierator
type
X
的可取消引用和可增加的值
r
,以及适当类型的值
o
,表达式

*r++ = o;
是有效的,并且具有与

X a(r);
++r;
*a = o;
然而,如果
r
在中间期间增加了不止一次,那么
a
仍然是可解引用分配的;也就是说,这个代码有效吗

X a(r);
++r;
++r;
*a = o;
很难看出对一个值的操作如何影响对另一个值的操作的有效性,但例如,
inputierator
(24.2.3)在
++r
的后置条件下:

有没有
r
的先前值为否 需要的时间更长 可取消引用的或处于
==
的域

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


此外,如果这不要求是有效的,是否有任何情况下,利用其非有效性将有助于实现
输出迭代器类型(w.r.t.效率、简单性),同时仍遵守现有要求?

该问题于2004年提出,中的措辞澄清了该问题,要求输出迭代器只需要支持交替增量和解引用/赋值序列。因此,在您的示例中,
r
不需要在第一个
++r
之后递增,除非存在中间的取消引用/赋值。SGI也要求这种行为(见脚注3)。正如您前面提到的,n3225出现时没有n3066的修复,因此被提出;但遗憾的是,该修复程序并没有进入C++11的发布版本(ISO/IEC 14882:2011)

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

“在此操作之后,[即,
++r
]
r
不需要递增,并且
r
先前值的任何副本不再需要可取消引用或递增。”


在某些情况下,这可能有助于实现(就简单性而言):例如,请参见
ostream_迭代器
,其中仅返回
*此
,即可忽略此类(无效)双增量;只有解引用/赋值才会导致
ostream\u迭代器实际递增。

SGI STL(脚注3)明确禁止这种行为,强制执行一系列交替递增和解引用赋值;但是,我不能从C++标准中得到这个要求。[24.2.4:2]中的“仅一次”是指一次还是最多一次?这个答案:()让我认为这种行为对于
ostream_迭代器是有效的,它只在赋值时实际递增,而忽略其他递增操作。然而,似乎并不是所有的输出者都必须遵守这些语义,这很有趣。在标准中仅出现一次5次,在3.4:1处有不同的含义,在5.17:7、12.8:15、29.6.5:8处最多出现一次(但通常是一次)。恰好一次,最多一次,每次出现5次。当然,如果该标准是针对SGI限制的,他们会采用这种语言?实际上,似乎有人在2004年发现了这种语言:(),n3066()中的措辞似乎证实了“交替增量/取消引用”的要求,你不同意吗?奇怪的是,当n3066的其余部分出现时(据我所知),这并没有出现在我的14882:2011副本中。@nknight和更多的挖掘揭示,这是在n3225出现后提出的,没有n3066的修复。因此,该标准的意图是明确的,它只是没有及时进入发布版本。作为答案发布,我将接受。