gpt4 book ai didi

c++ - 对双倍递增的 OutputIterator 的取消引用赋值

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:16 25 4
gpt4 key购买 nike

根据(优秀的)问题 C++ OutputIterator post-increment requirements ,我们观察到对于 OutputIterator 类型 X 的可取消引用和递增值 r,以及适当类型的值 o , 表达式

*r++ = o;

是有效的并且具有等同于

的语义
X a(r);
++r;
*a = o;

但是,如果 r 在中间期间增加了不止一次,那么 a 是否仍然是可解引用赋值的?也就是说,这个代码有效吗?

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

很难看出对一个值的操作如何影响对另一个值的操作的有效性,但是例如InputIterator (24.2.3) 在 ++r 的后置条件下有:

Any copies of the previous value of r are no longer required either to be dereferenceable or to be in the domain of ==.

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

此外,如果这不需要是有效的,那么在任何情况下,利用它的无效性是否有助于OutputIterator 类型,同时仍遵守现有要求?

最佳答案

此问题于 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 那样使用:

"After this operation [i.e., ++r] r is not required to be incrementable and any copies of the previous value of r are no longer required to be dereferenceable or incrementable."

有些情况下这可能有助于实现(就简单性而言):参见例如this questionostream_iterator 上,忽略这种(无效的)双增量,只是返回 *this;只有取消引用/赋值会导致 ostream_iterator 实际递增。

关于c++ - 对双倍递增的 OutputIterator 的取消引用赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11887104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com