当参数失败时调用与互斥量配对。无法将互斥锁插入 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());
下面是错误的
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());