首页 > 解决方案 > 对“pair<...>”类型的非常量左值引用不能绑定到“pair<...>”类型的临时值

问题描述

我正在尝试使用auto&语法获取对已放置项目的引用,但由于上述错误而无法编译。

在这种情况下,如何获得对已放置项目的参考?

我尝试使用const auto&,但该对象似乎在我的实际应用程序上调用析构函数,因此它似乎充其量只是一个假引用。

#include <string>
#include <unordered_map>

class Connection {
   public:
     bool foo{};
};

int main() {
    std::unordered_map<std::string, Connection> connections;

    auto& [connection, inserted] = connections.try_emplace("test");
}

标签: c++

解决方案


那是因为try_emplace返回 a pair<iterator, bool>,这是一个临时的,而不是对插入元素的引用。请参阅cppreference 上的说明

安置后,你可以说

auto& elem = connections["test"];

或者

auto [connection, inserted] = connections.try_emplace("test");
auto& elem = *connection;

例如,获取对元素的引用。

第一个变体返回对与 key 关联的实际值的引用test,而第二个变体返回对 map 元素的引用,即 a pair<const key_type, mapped_type>,即第一个版本基本上second直接返回所述对。

const auto&编译是因为声明const对临时引用的引用是合法的,但不是非const左值引用。


推荐阅读