仅移动输入和输出迭代器
move-only input and output iterators
关于输入迭代器/输出迭代器-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
,但我建议不要这样做。
当然,forward_iterator
仍然需要copyable
。哨兵也需要copyable
您可以在以下论文中阅读有关设计的矿石
- 单程迭代器的可移动性
- 仅移动视图
- 不可复制迭代器的范围适配器
输入/输出迭代器必须首先满足迭代器要求。这个要求说,从C++14开始,[iterator.iterators],p2:
在以下情况下,类型
X
满足Iterator
要求:
X
满足CopyConstructible
、CopyAssignable
和Destructible
要求 (17.6.3.1)
所以不,它们不能只移动。
这可能不是一个好主意。 迭代器对象通常设计为轻量级,并按值传递以提高效率。 许多C++标准库容器都使用按值传递的迭代器。禁用复制构造函数对我来说似乎根本不是一个好主意。
例如,请参阅 http://www.cplusplus.com/reference/vector/vector/vector/向量构造函数按值接受输入迭代器。
有关按值接受输出迭代器的 C++ 标准库容器的示例,请参见 http://www.cplusplus.com/reference/algorithm/copy/
- 集合上的输出迭代器:assign和increment迭代器
- 在静态库中使用输出迭代器时出现链接器错误
- 在插入容器之前转换输出迭代器
- 根据 boost::iterator_facade 定义基于代理的输出迭代器
- C++:为什么输出迭代器不支持比较操作?
- 输入迭代器可以重复读取,而输出迭代器只能写入一次
- 是C 正向/BIDI/随机迭代器总是输出迭代器
- stl风格的算法:如何管理输出迭代器
- 如何在C++中获取任意 (STL) 输出迭代器的"assignable type"
- 无法复制到输出迭代器
- 如何在C++中输出迭代器
- 要写入输出迭代器的模板成员函数
- 输入和输出迭代器
- std::transform 中的输入迭代器和输出迭代器来自同一个容器是否安全?
- 使用输出迭代器不起作用的通用函数示例
- 仅移动输入和输出迭代器
- 用Python生成器替换c++ STL输出迭代器
- 使用先前已移动的输出迭代器调用move()是标准的c++吗?
- STL映射输出迭代器查找值
- 输入迭代器+输出迭代器+X=正向迭代器