无法构造向量<std :: unique <...>&gt;使用初始化列表

时间:2015-09-16 07:04:30

标签: c++ c++11 unique-ptr initializer-list

我尝试使用初始化列表初始化unique_ptr的向量,但它因编译器错误而失败。这看起来很奇怪,因为它看起来与我见过的一些例子类似。

std::vector<std::unique_ptr<std::string>> v{
    std::unique_ptr<std::string>{new std::string{"foo"}}
};

发生编译错误。

.../memory:1645:31: error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<std::__1::basic_string<char>, std::__1::default_delete<std::__1::basic_string<char> > >'
        ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
...
...47: note: in instantiation of member function 'std::__1::vector<std::__1::unique_ptr<std::__1::basic_string<char>, std::__1::default_delete<std::__1::basic_string<char> > >, std::__1::allocator<std::__1::unique_ptr<std::__1::basic_string<char>, std::__1::default_delete<std::__1::basic_string<char> > > > >::vector' requested here
std::vector<std::unique_ptr<std::string>> v{
                                          ^

1 个答案:

答案 0 :(得分:0)

std::unique_ptr没有复制构造函数。您创建一个实例,然后要求std::vector在初始化期间复制该实例。

error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<std::__1::basic_string<char>, std::__1::default_delete<std::__1::basic_string<char> > >'
        ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
  

该类满足MoveConstructible和的要求   MoveAssignable,但不是CopyConstructible的要求   或CopyAssignable。

以下内容适用于新的emplace调用。但无法使用初始化列表。

std::vector< std::unique_ptr< std::string > > v;
v.emplace_back( new std::string{ "foo" } );

有关详细信息,请参阅using unique_ptr with standard library containers