Por que não posso push_back um unique_ptr em um vetor?

O que há de errado com este programa?

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

O erro:

 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: In member function 'void __gnu_cxx::new_allocator::construct(_Tp*, const _Tp&) [with _Tp = std::unique_ptr, _Tp* = std::unique_ptr*]': c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_vector.h:745:6: instantiated from 'void std::vector::push_back(const value_type&) [with _Tp = std::unique_ptr, _Alloc = std::allocator<std::unique_ptr >, value_type = std::unique_ptr]' main.cpp:16:21: instantiated from here c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h:207:7: error: deleted function 'std::unique_ptr::unique_ptr(const std::unique_ptr&) [with _Tp = int, _Tp_Deleter = std::default_delete, std::unique_ptr = std::unique_ptr]' 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: In member function 'void std::vector::_M_insert_aux(std::vector::iterator, _Args&& ...) [with _Args = {const std::unique_ptr&}, _Tp = std::unique_ptr, _Alloc = std::allocator<std::unique_ptr >, std::vector::iterator = __gnu_cxx::__normal_iterator<std::unique_ptr*, std::vector<std::unique_ptr > >, typename std::vector::_Base::_Tp_alloc_type::pointer = std::unique_ptr*]': c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/stl_vector.h:749:4: instantiated from 'void std::vector::push_back(const value_type&) [with _Tp = std::unique_ptr, _Alloc = std::allocator<std::unique_ptr >, value_type = std::unique_ptr]' main.cpp:16:21: instantiated from here c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/unique_ptr.h:207:7: error: deleted function 'std::unique_ptr::unique_ptr(const std::unique_ptr&) [with _Tp = int, _Tp_Deleter = std::default_delete, std::unique_ptr = std::unique_ptr]' c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c++/bits/vector.tcc:314:4: error: used here 

Você precisa mover o unique_ptr :

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

unique_ptr garante que um único contêiner unique_ptr possua o ponteiro em espera. Isso significa que você não pode fazer cópias de um unique_ptr (porque dois unique_ptr s teriam propriedade), então você só pode movê-lo.

Observe, no entanto, que seu uso atual de unique_ptr está incorreto. Você não pode usá-lo para gerenciar um ponteiro para uma variável local. O tempo de vida de uma variável local é gerenciado automaticamente: variables ​​locais são destruídas quando o bloco termina (por exemplo, quando a function retorna, neste caso). Você precisa alocar dinamicamente o object:

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

std :: unique_ptr não possui um construtor de cópias. Você cria uma instância e, em seguida, solicita ao std :: vector para copiar essa instância durante a boot.

 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, std::unique_ptr<_Tp, _Tp_Deleter> = std::unique_ptr]' 

A class satisfaz os requisitos de MoveConstructible e MoveAssignable, mas não os requisitos de CopyConstructible ou CopyAssignable.

O seguinte funciona com as novas chamadas do emplace .

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

Veja usando unique_ptr com contêineres de biblioteca padrão para leitura adicional.