std::map插入node_handle后会导致原有句柄失效无法使用吗?
问题解答
你的理解完全正确。std::map的insert(node_type&& nh)重载接收右值引用参数,本质是把node handle持有的节点所有权完全转移到目标map里。node handle本身是移动独占的类型,所有权转移后,原来的nh就处于空状态,不再关联任何有效节点,这时候再调用nh.value()属于未定义行为,肯定没法用来修改值。
你给出的两种用法判定完全准确,这里补充一个小细节:insert返回的不是直接的迭代器,而是insert_return_type结构体,需要取它的position成员拿到指向插入节点的迭代器:
std::map<...> m; // 错误用法:insert执行后nh已为空,调用value()是非法操作 m.insert(std::move(nh)); // 实际编码中建议显式写std::move标记所有权转移,可读性更好 nh.value() = new_value; // 正确用法:通过insert返回的迭代器修改map中已插入的节点值 auto insert_res = m.insert(std::move(nh)); if (insert_res.inserted) { // 可以先判断是否插入成功再操作 insert_res.position->second = new_value; }
内容的提问来源于stack exchange,提问作者user2052436
相关产品推荐
相关产品推荐

