gpt4 book ai didi

c++ - 为什么迭代器需要 CopyConstructible 和 CopyAssignable?

转载 作者:可可西里 更新时间:2023-11-01 18:35:38 25 4
gpt4 key购买 nike

根据 en.cppreference.com和 VC++ 14.0,迭代器需要有复制构造函数和复制赋值运算符。

我的迭代器类(它遍历 Windows 进程)不可能是可复制构造的或可复制分配的 - 它拥有一个 HANDLE 来快照并管理释放它,所以不可能复制那些 -移动它们是可能的,我提供了一个移动构造函数和移动赋值运算符。然而,算法 std::find_if 复制它们(在 VC++ 14.0 中调用一些 std::_Find_if 需要复制迭代器)并且不想工作。

Why does your iterator hold on to a resource? An iterator should be like a pointer where it points to something.

因为为了遍历 Windows 进程,您需要创建一个快照,然后使用它来执行此操作 - 问题是,一个快照,一个迭代。快照也不可复制。

为什么它们不能只是 MoveConstructibleMoveAssignable?哪些算法(如果有)真正需要复制迭代器才能工作?

最佳答案

TL;DR:由于历史原因。

我认为,为什么 ForwardIterator 和其他功能更强大的迭代器需要可复制的原因或多或少是显而易见的。至于InputIteratorOutputIterator,情况就稍微复杂一些。

InputIteratorOutputIterator 具有一次性的性质,这与仅移动类的概念非常吻合。现在,当您使用标准库中的任何这些迭代器时(例如,假设它是 istream_iterator),您可以复制它并取消引用该拷贝,但是任何拷贝的推进都会推进所有这些,这看起来不像预期的行为。

不幸的是,在编写许多 STL 算法(如 std::find_ifstd::copy 等)时根本没有移动语义,并且没有办法要求 InputIterator 是可移动构造的。

从那时起,在某些平台上,STL 算法实际上要求给定的迭代器是可复制的(如本例),而在其他平台上(如 g++ AFAIK),InputIterator 的概念要求这种行为> 每次使用 STL 算法时都会在编译时检查。

此外,您还可以找到 this answer有用。

关于c++ - 为什么迭代器需要 CopyConstructible 和 CopyAssignable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32276110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com