仅移动输入和输出迭代器

时间:2016-02-06 16:26:11

标签: c++ c++11 iterator move

关于InputIterator / OutputIterator - s是否一致将修改其语义仅限于移动?当然我的意思是只有新创建的自定义迭代器,而不是 STL

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

  

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

     

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

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

3 个答案:

答案 0 :(得分:4)

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

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

仍然可以创建不是copyable的{​​{1}} input_iteratoroutput_iterator,但我建议不要这样做。

当然,仍然需要

copyableforward_iterator。哨兵还必须为copyable

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

答案 1 :(得分:2)

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

  

如果符合以下情况,则X类型符合Iterator要求:

     
      
  • X符合CopyConstructibleCopyAssignableDestructible要求(17.6.3.1)
  •   

所以不,他们不能只是移动。

答案 2 :(得分:0)

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

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

请参阅http://www.cplusplus.com/reference/algorithm/copy/以获取按值接受输出迭代器的C ++标准库容器的示例