[英]move-only input and output iterators
关于InputIterator / OutputIterator -s 将它们的语义修改为仅移动是否一致? 当然,我指的只是新创建的自定义迭代器,而不是STL迭代器。
对输入和输出迭代器的++i
和++r
表达式的语义要求的注释相应说:
后置条件:
i
的先前值的任何副本不再需要可取消引用或位于==
的域中。在此操作之后,
r
不需要是可增加的,并且r
的先前值的任何副本不再需要是可取消引用或可增加的。
我认为在大多数情况下禁止拥有输入/输出迭代器副本的可能性更安全,但从未听过这样的建议。 这是个坏主意吗?
在 C++20 中,新的迭代器概念input_iterator
和output_iterator
不需要可复制。 ranges
命名空间中的算法以及视图适配器也仅支持移动迭代器。
新视图ranges::istream_view
返回仅移动迭代器以提高安全性。 最后,新的 C++20 view
概念本身不需要可复制性,它只允许移动自己的状态。
仍然可以创建不可copyable
copyable
input_iterator
和output_iterator
,但我建议不output_iterator
。
当然, forward_iterator
仍然需要是可copyable
。 哨兵也需要可copyable
您可以在以下论文中阅读有关该设计的内容
Input/OutputIterator 必须首先满足 Iterator 要求。 这个要求说,从 C++14,[iterator.iterators],p2:
如果满足以下条件,则类型
X
满足Iterator
要求:
X
满足CopyConstructible
、CopyAssignable
和Destructible
要求 (17.6.3.1)
所以不,他们不能只移动。
这可能不是一个好主意。 迭代器对象通常被设计为轻量级的,并通过值传递以提高效率。 并且许多 C++ 标准库容器使用按值传递的迭代器。 禁用复制构造函数对我来说似乎根本不是一个好主意。
例如,参见http://www.cplusplus.com/reference/vector/vector/vector/向量构造函数按值接受输入迭代器。
并参阅http://www.cplusplus.com/reference/algorithm/copy/以获取按值接受输出迭代器的 C++ 标准库容器示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.