问题描述
以下是错误
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());