我尝试使用初始化列表初始化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{
^
答案 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。