鉴于 Visual Studio 2010 中的代码:
void Foo::Bar() const
{
map_t::const_iterator iter(my_map_.find(key));
if(my_map_.end() != iter)
DoStuff(iter->second);
}
Do stuff 将按值采用 mapped_type。映射类型是可复制、可移动、可分配的类型。
我在尝试访问第二个时收到无法复制键/值对的错误消息。即使我自己写:
iter->second;
(*iter).second;
以确保它与 DoStuff 无关...
我假设迭代器在返回 operator-> 或 operator* 之前复制了键/值对。
如何获取映射类型的副本?
编辑:
地图本身是未签名的短裤,以增强变体,大致如下:
typedef struct{} empty_t;
typedef boost::variant<empty_t, double, long, some POD types> variant_t;
typedef std::map<unsigned short, variant_t> map_t;
然后作为班级的私人成员:
map_t my_map_;
需要明确的是,问题不在于 DoStuff。我可以删除该行,然后简单地取消引用迭代器并访问第二个,这将导致编译器错误。
if(my_map_.end() != iter)
iter->second; //Doesn't do anything, but illustrates the error.