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とブースト1.59を使用しています

4

1 に答える 1