为什么我不能push_back一个unique_ptr成vector?

这个程序有什么问题?

#include <memory> #include <vector> int main() { std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); //This tiny command has a vicious error. return 0; } 

错误:

 $ g++ -std=gnu++0x main.cpp In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c+ +/mingw32/bits/c++allocator.h:34:0, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c+ +/bits/allocator.h:48, from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c+ +/memory:64, from main.cpp:6: c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: I n member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = std::unique_ptr<int>, _Tp* = std::unique_ptr< int>*]': c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_vector.h:74 5:6: instantiated from 'void std::vector<_Tp, _Alloc>::push_back(con st value_type&) [with _Tp = std::unique_ptr<int>, _Alloc = std::alloca tor<std::unique_ptr<int> >, value_type = std::unique_ptr<int>]' main.cpp:16:21: instantiated from here c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h:20 7:7: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::uniqu e_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_D eleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> = std::unique_ptr<int>]' c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/ext/new_allocator.h: 105:9: error: used here In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c+ +/vector:69:0, from main.cpp:7: c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h: I n member function 'void std::vector<_Tp, _Alloc>::_M_insert_aux(std::v ector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {const std::u nique_ptr<int>&}, _Tp = std::unique_ptr<int>, _Alloc = std::allocator< std::unique_ptr<int> >, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx ::__normal_iterator<std::unique_ptr<int>*, std::vector<std::unique_ptr <int> > >, typename std::vector<_Tp, _Alloc>::_Base::_Tp_alloc_type::p ointer = std::unique_ptr<int>*]': c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_vector.h:74 9:4: instantiated from 'void std::vector<_Tp, _Alloc>::push_back(con st value_type&) [with _Tp = std::unique_ptr<int>, _Alloc = std::alloca tor<std::unique_ptr<int> >, value_type = std::unique_ptr<int>]' main.cpp:16:21: instantiated from here c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h:20 7:7: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::uniqu e_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_D eleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> = std::unique_ptr<int>]' c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/vector.tcc:314: 4: error: used here 

你需要移动unique_ptr

 vec.push_back(std::move(ptr2x)); 

unique_ptr保证单个unique_ptr容器拥有所持有的指针的所有权。 这意味着你不能创build一个unique_ptr副本(因为那么两个unique_ptr将拥有所有权),所以你只能移动它。

但是,请注意,您当前使用unique_ptr是不正确的。 你不能用它来pipe理一个指向局部variables的指针。 局部variables的生命周期是自动pipe理的:局部variables在块结束时被销毁(例如,当函数返回时)。 您需要dynamic分配对象:

 std::unique_ptr<int> ptr(new int(1)); 

std :: unique_ptr没有拷贝构造函数。 你创build一个实例,然后在初始化过程中要求std :: vector复制该实例。

 error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::uniqu e_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_D eleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> = std::unique_ptr<int>]' 

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

以下使用新的emplace调用。

 std::vector< std::unique_ptr< int > > vec; vec.emplace_back( new int( 1984 ) ); 

请参阅使用unique_ptr与标准库容器进一步阅读。