矢量对不可复制的非可移动类型和emplace_back

时间:2016-09-05 05:15:50

标签: c++11

这基本上是对我之前的问题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的限制吗?

1 个答案:

答案 0 :(得分:3)

std::vector::emplace_back的文档中,请注意类型要求为MoveInsertable

虽然emplace_back不会移动新元素,但在重新分配存储时,可能仍需要移动现有元素。因此没有实用的方法来使用具有不可移动类型的向量。

请注意,std::deque::emplace_back 具有该要求,并且应该小心使用。

或者,如果您需要使用vector,则可以将该类型包装在std::unique_ptr中以使其可移动。