#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->second
或return insert(value_type(k, mapped_type())).first->second
,这基本上是已注释掉的陈述
显然事实并非如此。 operator []
在内部执行一些placement new
魔术吗?
或者ptr_deque
还有什么特别之处吗?
我正在使用gcc-6.1&amp;提升1.59
答案 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&&)