我试图循环地图的条目,我得到意想不到的副本.这是程序:
#include <iostream>
#include <map>
#include <string>
struct X
{
X()
{
std::cout << "default constructor\n";
}
X(const X&)
{
std::cout << "copy constructor\n";
}
};
int main()
{
std::map<int, X> numbers = {{1, X()}, {2, X()}, {3, X()}};
std::cout << "STARTING LOOP\n";
for (const std::pair<int, X>& p : numbers)
{
}
std::cout << "ENDING LOOP\n";
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
default constructor
copy constructor
default constructor
copy constructor
default constructor
copy constructor
copy constructor
copy constructor
copy constructor
STARTING LOOP
copy constructor …Run Code Online (Sandbox Code Playgroud) 根据en.cppreference.com和VC++ 14.0,迭代器需要具有复制构造函数和复制赋值运算符.
我的迭代器类(它通过Windows进程迭代)不能是可复制构造或可复制 - 它拥有一个HANDLE快照并管理释放它所以不可能复制那些 - 移动它们是可能的,我提供了一个移动构造函数和移动赋值运算符.但是,算法会std::find_if复制它们(在VC++ 14.0中是一些std::_Find_if需要复制迭代器的调用)并且不想工作.
为什么你的迭代器会占用资源?迭代器应该像指针指向某个东西.
因为为了遍历Windows进程,您需要创建一个快照,然后使用它来执行此操作 - 问题是,一个快照,一个迭代.快照也不可复制.
为什么他们不能MoveConstructible和MoveAssignable?哪些算法(如果有的话)真的需要复制迭代器才能工作?