向存储std::reference_wrapper的unordered_map插入非const值失败原因求解
问题解答
底层原因
std::unordered_map为了保证哈希索引的稳定性,内部存储的所有键值对类型固定为std::pair<const Key, T>,键本身是不可修改的。
当你调用第一个mapk_s的find()方法获取迭代器后,解引用得到的(*it).first是const A类型的左值:
- 若第二个map的值类型为
std::reference_wrapper<A>,相当于尝试将const限定的A对象绑定到非const的引用包装器,违反C++的const限定规则,编译直接失败 - 改为
std::reference_wrapper<const A>后,引用包装器的const限定和源对象匹配,因此可以正常构造并插入
如果确实需要修改源A对象的非const成员,不建议直接通过第二个map的引用操作,避免误改键值破坏哈希表结构,应优先通过第一个map的合法操作修改对应条目。
双向查询结构推荐
你要实现的键值双向查询场景,有更成熟的现成方案可选:
- 可直接使用Boost库的
boost::bimap,这是专门设计的双向映射容器,原生支持通过左键、右键互相查询,内部已经处理了双向索引的一致性问题 - 若不想引入Boost依赖,也可以封装两个
unordered_map的组合(和你当前思路一致),只需注意保证两个map的增删操作原子性,避免出现两边数据不一致的问题,同时严格控制引用生命周期和源map绑定,避免出现悬空引用。
内容的提问来源于stack exchange,提问作者Robert Lica
相关产品推荐
相关产品推荐

