繁体   English   中英

仅移动输入和输出迭代器

[英]move-only input and output iterators

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

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

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

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

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

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

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

仍然可以创建不可copyable copyable input_iteratoroutput_iterator ,但我建议不output_iterator

当然, forward_iterator仍然需要是可copyable 哨兵也需要可copyable

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

Input/OutputIterator 必须首先满足 Iterator 要求。 这个要求说,从 C++14,[iterator.iterators],p2:

如果满足以下条件,则类型X满足Iterator要求:

  • X满足CopyConstructibleCopyAssignableDestructible要求 (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM