map / unordered_map具有不可移动的默认可构造值类型

时间:2014-03-06 16:06:44

标签: c++ c++11 stl move

更新:在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;
    ^

1 个答案:

答案 0 :(得分:4)

两个选项。

一个是您尝试的第三件事m[1]应该编译。你得到什么错误?

第二种方法是将emplacepiecewise_construct构造函数一起使用:

m.emplace(std::piecewise_construct, std::make_tuple(1), std::tuple<>());

这个应该工作,虽然我认为很可能有标准库在那里没有。