关于InputIterator / OutputIterator - s是否一致将修改其语义仅限于移动?当然我的意思是只有新创建的自定义迭代器,而不是 STL 。
对输入和输出迭代器的++i
和++r
表达式的语义要求的注释相应地说:
后置条件:以前
i
值的任何副本不再需要可解除引用或位于==
的域中。在此操作之后,
r
不需要是可递增的,并且前一个值r
的任何副本不再需要可解除引用或递增。
我认为在大多数情况下禁止有输入/输出迭代器副本的可能性更安全,但从未听过这样的建议。这不好主意吗?
答案 0 :(得分:4)
在C ++ 20中,新的迭代器概念input_iterator
和output_iterator
不需要可复制。
ranges
命名空间中的算法以及视图适配器也仅支持移动迭代器。
新视图ranges::istream_view
返回仅移动迭代器,以提高安全性。
最后,新的C ++ 20 view
概念本身并不需要可复制性,它只允许移动其自身的状态。
仍然可以创建不是copyable
的{{1}} input_iterator
和output_iterator
,但我建议不要这样做。
copyable
个forward_iterator
。哨兵还必须为copyable
您可以在以下论文中阅读有关该设计的矿石
答案 1 :(得分:2)
输入/输出迭代器必须首先满足迭代器要求。而这个要求来自C ++ 14,[iterator.iterators],p2:
如果符合以下情况,则
X
类型符合Iterator
要求:
X
符合CopyConstructible
,CopyAssignable
和Destructible
要求(17.6.3.1)
所以不,他们不能只是移动。
答案 2 :(得分:0)
这可能不是一个好主意。迭代器对象通常设计为轻量级并且按值传递以便高效。许多C ++标准库容器使用按值传递的迭代器。禁用复制构造函数对我来说似乎不是一个好主意。
例如,参见http://www.cplusplus.com/reference/vector/vector/vector/,向量构造函数按值接受输入迭代器。
请参阅http://www.cplusplus.com/reference/algorithm/copy/以获取按值接受输出迭代器的C ++标准库容器的示例