C++用auto&接收try_emplace返回值报错无法绑定临时pair如何处理
报错原因
std::unordered_map::try_emplace 的返回值是临时的std::pair<iterator, bool>类型对象,C++标准不允许非const左值引用(你代码里写的auto&)绑定到临时对象,这是编译失败的直接原因。
另外你原有写法的结构化绑定逻辑有误:返回pair的第一个元素是指向容器内键值对的迭代器,不是你要的Connection对象本身,就算编译通过也拿不到目标对象的引用。
正确实现方式
两种常用写法都可以稳定拿到插入元素的引用:
- 值接收返回pair,开销极小
try_emplace返回的pair仅包含一个迭代器和bool值,拷贝成本可以忽略,是最常用的写法:
#include <string> #include <unordered_map> class Connection { public: bool foo{}; }; int main() { std::unordered_map<std::string, Connection> connections; // 直接值接收返回的pair,结构化绑定拿到迭代器和插入标记 auto [it, inserted] = connections.try_emplace("test"); // 从迭代器中拿到Connection对象的可变引用 Connection& connection = it->second; // 后续正常使用connection即可,只要容器不销毁/元素不被删除,引用始终有效 connection.foo = true; }
- 用万能引用绑定临时对象
如果你不想拷贝返回的pair,可以用auto&&(万能引用)绑定临时对象,临时pair的生命周期会被延长到当前作用域结束,同时保留修改权限:
int main() { std::unordered_map<std::string, Connection> connections; auto&& [it, inserted] = connections.try_emplace("test"); Connection& connection = it->second; }
为什么const auto&会触发析构?
const auto&虽然可以绑定临时对象并延长其生命周期,但如果你的后续逻辑需要转移/修改Connection对象的所有权,const引用会限制对应操作,间接导致对象被提前析构;另外结构化绑定的const属性会传递到迭代器的访问逻辑,不符合大部分业务场景的修改需求,因此不推荐这种写法。
内容的提问来源于stack exchange,提问作者jeffbRTC
相关产品推荐
相关产品推荐

