C++ 使用带有std::unique\u ptr元素的boost::multi_index::multi_index_容器的初始值设定项列表

C++ 使用带有std::unique\u ptr元素的boost::multi_index::multi_index_容器的初始值设定项列表,c++,c++11,unique-ptr,initializer-list,boost-multi-index,C++,C++11,Unique Ptr,Initializer List,Boost Multi Index,尝试使用初始值设定项列表将值分配到包含任何类型的std::unique_ptr元素的boost::multi_index::multi_index_容器对象时,我遇到编译错误 下面是一个简短的示例(也可在上获得): 恐怕我不太明白这里发生了什么事。为什么要调用复制构造函数?这仅仅是一个Boost的限制吗?有没有可行的解决方案-具体地说,一个与我的目标编译器,Visual C++ 12?< /p> 一起使用,只允许 const 访问它的元素,这意味着它们不能被移动,必须被复制。 摘自N3337,§

尝试使用初始值设定项列表将值分配到包含任何类型的
std::unique_ptr
元素的
boost::multi_index::multi_index_容器
对象时,我遇到编译错误

下面是一个简短的示例(也可在上获得):

恐怕我不太明白这里发生了什么事。为什么要调用复制构造函数?这仅仅是一个Boost的限制吗?有没有可行的解决方案-具体地说,一个与我的目标编译器,Visual C++ 12?< /p> 一起使用,只允许<代码> const 访问它的元素,这意味着它们不能被移动,必须被复制。 摘自N3337,§18.9.1/2[支持。初始列表]

初始值设定项列表
类型的对象提供对
常量
类型的对象数组的访问

因此,分配给
foo
的任务试图复制
唯一的\u ptr
,当然失败了

foo = { std::make_unique<int>(0), std::make_unique<int>(1) };
foo={std::make_unique(0),std::make_unique(1)};
有一些变通方法,但我认为它们在这种情况下不会有用

In file included from test.cpp:1:
In file included from boost/multi_index_container.hpp:20:
boost/detail/allocator_utilities.hpp:153:11: error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<int, std::__1::default_delete<int> >'
  new (p) Type(t);
          ^    ~
boost/multi_index/detail/index_base.hpp:105:33: note: in instantiation of function template specialization 'boost::detail::allocator::construct<std::__1::unique_ptr<int, std::__1::default_delete<int> > >' requested here
      boost::detail::allocator::construct(&x->value(),v);
                                ^

boost/multi_index/detail/index_base.hpp:144:12: note: in instantiation of member function 'boost::multi_index::detail::index_base<std::__1::unique_ptr<int, std::__1::default_delete<int> >, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::identity<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::insert_' requested here
    return insert_(v,x,lvalue_tag());
           ^

boost/multi_index/ordered_index.hpp:728:33: note: in instantiation of member function 'boost::multi_index::detail::index_base<std::__1::unique_ptr<int, std::__1::default_delete<int> >, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::identity<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::insert_' requested here
    final_node_type* res=super::insert_(v,position,x,variant);
                                ^

boost/multi_index_container.hpp:657:27: note: in instantiation of function template specialization 'boost::multi_index::detail::ordered_index<boost::multi_index::identity<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, std::__1::less<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, boost::multi_index::detail::nth_layer<1, std::__1::unique_ptr<int, std::__1::default_delete<int> >, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::identity<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >, boost::mpl::vector0<mpl_::na>, boost::multi_index::detail::ordered_unique_tag>::insert_<boost::multi_index::detail::lvalue_tag>' requested here
    node_type* res=super::insert_(v,position,x,variant);
                          ^

boost/multi_index_container.hpp:669:12: note: in instantiation of function template specialization 'boost::multi_index::multi_index_container<std::__1::unique_ptr<int, std::__1::default_delete<int> >, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::identity<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::insert_<boost::multi_index::detail::lvalue_tag>' requested here
    return insert_(v,position,detail::lvalue_tag());
           ^

boost/multi_index_container.hpp:339:30: note: in instantiation of member function 'boost::multi_index::multi_index_container<std::__1::unique_ptr<int, std::__1::default_delete<int> >, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::identity<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::insert_' requested here
      hint=x.make_iterator(x.insert_(*first,hint.get_node()).first);
                             ^

test.cpp:15:6: note: in instantiation of member function 'boost::multi_index::multi_index_container<std::__1::unique_ptr<int, std::__1::default_delete<int> >, boost::multi_index::indexed_by<boost::multi_index::ordered_unique<boost::multi_index::identity<std::__1::unique_ptr<int, std::__1::default_delete<int> > >, mpl_::na, mpl_::na>, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na>, std::__1::allocator<std::__1::unique_ptr<int, std::__1::default_delete<int> > > >::operator=' requested here
        foo = { std::make_unique<int>(0), std::make_unique<int>(1) };
            ^

libcxx-3.4/include/c++/v1/memory:2510:31: note: copy constructor is implicitly deleted because 'unique_ptr<int, std::__1::default_delete<int> >' has a user-declared move constructor
    _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT
                          ^
1 error generated.
foo = { std::make_unique<int>(0), std::make_unique<int>(1) };