这基本上是对我之前的问题Difference between std::unordered_map < K, boost::ptr_deque < T > >'s operator[] (K const &) and emplace
的跟进我正在尝试实现一个关联向量(称之为unordered_flat_map)并且想支持operator [key]
这是代码......
#include <utility>
#include <tuple>
#include <vector>
struct T
{
T() = default;
T(T const &) = delete;
T & operator = (T const &) = delete;
T(T &&) = delete;
T & operator = (T &&) = delete;
};
using S = T;
int main()
{
using value_type = std::pair < uint32_t, S >;
std::vector < value_type > testuvm;
value_type p(std::piecewise_construct, std::forward_as_tuple(2), std::forward_as_tuple());
// testuvm.emplace_back(std::piecewise_construct, std::forward_as_tuple(2), std::forward_as_tuple());
}
注释掉的行无法编译,如果找不到密钥,unordered_map::operator []
会执行此操作。有没有办法让这项工作?如果没有,为什么这不可能?这是由于vector
的限制吗?
答案 0 :(得分:3)
在std::vector::emplace_back
的文档中,请注意类型要求为MoveInsertable。
虽然emplace_back
不会移动新元素,但在重新分配存储时,可能仍需要移动现有元素。因此没有实用的方法来使用具有不可移动类型的向量。
请注意,std::deque::emplace_back
不具有该要求,并且应该小心使用。
或者,如果您需要使用vector
,则可以将该类型包装在std::unique_ptr
中以使其可移动。