0
#include <memory>
#include <unordered_map>
#include <vector>
#include <utility>
#include <boost/ptr_container/ptr_deque.hpp>

struct T
{
    T() = default;
    T(T const &) = delete;
    T & operator = (T const &) = delete;
    T(T &&) = default;
    T & operator = (T &&) = default;
};

using S = boost::ptr_deque < T >;

int main()
{
    std::unordered_map < uint32_t, S > testum;
    //  testum.emplace(1u, S());
    //  testum.insert(std::make_pair(1u, S()));
    testum[1].push_back(new T());
}

在上面的示例中,注释掉的行不会编译,因为它们试图复制ptr_deque不可复制的元素。但是,push_back表格有效。

我在想那operator [] (K const &)只是return emplace(k, mapped_type()).first->secondor return insert(value_type(k, mapped_type())).first->second,本质上是注释掉的语句

显然情况并非如此。是否在内部operator []执行一些placement new魔术?

还是有什么特别之处ptr_deque

我正在使用 gcc-6.1 & boost 1.59

4

1 回答 1

2

根据http://en.cppreference.com/w/cpp/container/unordered_map/operator_at

2) 如果键不存在,则插入value_type就地构造的对象 。std::piecewise_construct, std::forward_as_tuple(std::move(key)), std::tuple<>()

(我指的是Key&&重载,因为在注释掉的行中,您使用右值作为 . 的参数operator[]。尽管在这种情况下Key=int差异非常小。)

所以关于你的问题,operator[](Key&&)大致相当于

return emplace(std::piecewise_construct,
               std::forward_as_tuple(std::move(k)),
               std::tuple<>()).first->second;
于 2016-08-24T21:18:02.527 回答