无法使用初始化列表构建向量<std::unique<...>>

Unable to construct a vector<std::unique<...>> using an initialiser 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{
                                          ^

std::unique_ptr has no copy constructor. You create an instance and then ask the 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)...);

The class satisfies the requirements of MoveConstructible and MoveAssignable, but not the requirements of either CopyConstructible or CopyAssignable.

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

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

请参阅 using unique_ptr with standard library containers 进一步阅读。