更新:在23.5.4.3 here中显示m[1]
版本应该有效
Update2 :m[1]
正在使用gcc4.9.1
具体而言,std::mutex
。假设我想要std::unordered_map<int, std::mutex>
。这可能吗?
我似乎无法向mutex
添加map
而不会在某个级别上删除复制构造函数上的错误,无论是mutex
还是实习生{{} 1}}持有互斥锁。
std::pair
都无法编译。我真正想要的只是在m.emplace(1);
m.emplace(1, {});
m[1];
内就地构建mutex
。
我宁愿不使用map
,但我知道这可能是我最好的选择。
添加:std::unique_ptr<std::mutex>
的完整示例,在gcc和clang
operator[]
来自clang3.5的错误最相关的部分
#include <unordered_map>
#include <mutex>
int main() {
std::unordered_map<int, std::mutex> m;
m[1];
return 0;
}
和gcc 4.7.2
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/stl_pair.h:126:35: error: call to deleted constructor of 'std::mutex'
: first(std::forward<_U1>(__x)), second(__y) { }
^ ~~~
...
f.cpp:6:6: note: in instantiation of member function 'std::__detail::_Map_base<...>::operator[]' requested here
m[1];
^
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/mutex:163:5: note: 'mutex' has been explicitly marked deleted here
mutex(const mutex&) = delete;
^
答案 0 :(得分:4)
两个选项。
一个是您尝试的第三件事m[1]
应该编译。你得到什么错误?
第二种方法是将emplace
与piecewise_construct
构造函数一起使用:
m.emplace(std::piecewise_construct, std::make_tuple(1), std::tuple<>());
这个应该工作,虽然我认为很可能有标准库在那里没有。