根据en.cppreference.com和VC++ 14.0,迭代器需要具有复制构造函数和复制赋值运算符.
我的迭代器类(它通过Windows进程迭代)不能是可复制构造或可复制 - 它拥有一个HANDLE快照并管理释放它所以不可能复制那些 - 移动它们是可能的,我提供了一个移动构造函数和移动赋值运算符.但是,算法会std::find_if复制它们(在VC++ 14.0中是一些std::_Find_if需要复制迭代器的调用)并且不想工作.
为什么你的迭代器会占用资源?迭代器应该像指针指向某个东西.
因为为了遍历Windows进程,您需要创建一个快照,然后使用它来执行此操作 - 问题是,一个快照,一个迭代.快照也不可复制.
为什么他们不能MoveConstructible和MoveAssignable?哪些算法(如果有的话)真的需要复制迭代器才能工作?
TL;DR:由于历史原因。
ForwardIterator我认为,为什么其他功能更强大的迭代器需要可复制的原因或多或少是显而易见的。至于InputIterator和OutputIterator,情况有点复杂。
和具有一次性性质,这与仅移动类概念完全吻合InputIterator。OutputIterator现在,当您使用标准库中的任何一个迭代器时(例如istream_iterator),您可以复制它并取消引用该副本,但任何副本的推进都会推进所有副本,这看起来不像预期的那样行为。
不幸的是,在编写许多 STL 算法(如std::find_if、std::copy等)时,根本没有移动语义,也没有办法要求 是InputIterator可移动构造的。
从那时起,在某些平台上,STL 算法实际上要求给定的迭代器是可复制的(就像在本例中一样),而在其他平台上(例如 g++ AFAIK),这种行为是InputIterator每次使用时在编译时检查的概念所要求的。 STL 算法。
另外,您可能会发现这个答案很有用。
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |