std :: unordered_map<之间的区别K,boost :: ptr_deque< T> >的运算符[](K const&)和emplace

时间:2016-08-24 18:40:07

标签: c++11 boost unordered-map noncopyable boost-ptr-container

#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->secondreturn insert(value_type(k, mapped_type())).first->second,这基本上是已注释掉的陈述

显然事实并非如此。 operator []在内部执行一些placement new魔术吗?

或者ptr_deque还有什么特别之处吗?

我正在使用gcc-6.1&amp;提升1.59

1 个答案:

答案 0 :(得分: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[]的参数。虽然在{{{}}的情况下1}}差异非常微不足道。)

因此,在提及您的问题时,Key=int大致相当于

operator[](Key&&)