当参数失败时调用与互斥量配对。无法将互斥锁插入 unordered_map

Call to make pair with mutex as argument fails. Cannot insert mutex onto unordered map

下面是错误的

std::mutex mtx;
            auto t = std::make_pair(std::string("hello"), mtx);

但是下面不是?

std::mutex mtx;
            auto t = std::make_pair(std::string("hello"), 1);

我的最终目标是创建一个无序映射类型:

std::unordered_map<std::string, std::mutex>

使用:

mHeartBeatMutexes.insert(std::make_pair(std::string("hello"), mtx));

但是我的 IDE 说这是错误的,我不确定为什么。

std::mutex 不可复制或移动。当你这样做时

std::mutex mtx;
auto t = std::make_pair(std::string("hello"), mtx);

mHeartBeatMutexes.insert(std::make_pair(std::string("hello"), mtx));

std::make_pair 尝试制作 mtx 的副本,因为它是左值但不能,因为 std::mutex 不可复制。

std::mutex mtx;
auto t = std::make_pair(std::string("hello"), 1);

1 是一个整数文字,它具体化为一个临时整数,该整数被移动(真正复制,因为它是同一件事),这一切都很好。

要将互斥锁放入 std::unordered_map<std::string, std::mutex>,您需要做的是使用 emplace 函数直接在 unordered_map 中创建对,利用 std::piecewise_construct overload and std::forward_as_tuple 构建参数该对构造函数的每个成员都喜欢

std::unordered_map<std::string, std::mutex> foo;
foo.emplace(std::piecewise_construct,
            std::forward_as_tuple("hello"),
            std::forward_as_tuple());