仅移动输入和输出迭代器

move-only input and output iterators

本文关键字:输出 迭代器 输入 移动      更新时间:2023-10-16

关于输入迭代器/输出迭代器-s 将它们的语义修改为仅移动是否一致?当然,我的意思是只有新创建的自定义迭代器,而不是 STL 迭代器。

输入和输出迭代器的++i++r表达式的语义要求注释相应地说:

后置条件:以前值 i 的任何副本不再需要可取消引用或位于 == 域中。

在此操作之后,r不需要可递增,并且不再需要以前值 r 的任何副本可取消引用或递增。

我认为在大多数情况下禁止拥有输入/输出迭代器副本的可能性更安全,但从未听说过这样的建议。这是个坏主意吗?

在 C++20 中,新的迭代器概念input_iteratoroutput_iterator不需要可复制。ranges命名空间中的算法以及视图适配器也支持仅移动迭代器。

新视图ranges::istream_view返回仅移动迭代器以提高安全性。最后,新的 C++20 view概念本身不需要可复制性,这只允许它自己的状态被移动。

仍然可以创建不copyablecopyable input_iteratoroutput_iterator,但我建议不要这样做。

当然,forward_iterator仍然需要copyable。哨兵也需要copyable

您可以在以下论文中阅读有关设计的矿石

  • 单程迭代器的可移动性
  • 仅移动视图
  • 不可复制迭代器的范围适配器

输入/输出迭代器必须首先满足迭代器要求。这个要求说,从C++14开始,[iterator.iterators],p2:

在以下情况下,类型 X 满足Iterator要求:

  • X满足CopyConstructibleCopyAssignableDestructible要求 (17.6.3.1)

所以不,它们不能只移动。

这可能不是一个好主意。 迭代器对象通常设计为轻量级,并按值传递以提高效率。 许多C++标准库容器都使用按值传递的迭代器。禁用复制构造函数对我来说似乎根本不是一个好主意。

例如,请参阅 http://www.cplusplus.com/reference/vector/vector/vector/向量构造函数按值接受输入迭代器。

有关按值接受输出迭代器的 C++ 标准库容器的示例,请参见 http://www.cplusplus.com/reference/algorithm/copy/