由于参数失败,调用与互斥对进行配对无法将互斥锁插入无序映射

问题描述

以下是错误

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重载和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());

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...