You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于std::map/std::unordered_map的try_emplace未插入元素时是否保证不移动键的标准合规性问询

std::map/std::unordered_map的try_emplace未插入元素时是否保证不移动键的标准合规性问询

好问题!这确实是个容易让人产生歧义的细节点,我来帮你明确标准里的规定。

先看你的代码场景:

auto [_, emplaced] = map.try_emplace(std::move(key), std::move(value));

if (!emplaced) {
  // can I safely use key here?
}

你提到的“这些函数不会从右值参数移动”的表述,上下文确实容易让人误以为只针对value参数,但实际上标准的规定覆盖了所有参数:

根据C++17及后续版本的标准,当try_emplace因为键已经存在而未完成插入操作时,所有传入的参数(包括你用std::move传递的key)都不会被移动或修改。也就是说,即使你把key以右值的形式传递进去,只要插入失败,key的状态就会保持原样,你完全可以在!emplaced的分支里安全地继续使用它。

你在编译器上做的测试结果是符合标准要求的,这并不是某款编译器的特例——所有遵循C++标准的编译器都应该执行这个规则。

补充下设计逻辑:try_emplace的核心优势之一就是避免不必要的资源开销,它只会在确认要插入新元素的前提下,才会将参数移动到容器中;如果插入失败,就不会对任何参数执行移动操作,既节省了开销,也保证了参数的可用性。

备注:内容来源于stack exchange,提问作者Hesky Fisher

火山引擎 最新活动