Why can I not push_back a unique_ptr into a vector?

后端 未结 2 1132
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 08:00

What is wrong with this program?

#include 
#include 

int main()
{
    std::vector> vec;

    in         


        
相关标签:
2条回答
  • 2020-11-22 08:24

    You need to move the unique_ptr:

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

    unique_ptr guarantees that a single unique_ptr container has ownership of the held pointer. This means that you can't make copies of a unique_ptr (because then two unique_ptrs would have ownership), so you can only move it.

    Note, however, that your current use of unique_ptr is incorrect. You cannot use it to manage a pointer to a local variable. The lifetime of a local variable is managed automatically: local variables are destroyed when the block ends (e.g., when the function returns, in this case). You need to dynamically allocate the object:

    std::unique_ptr<int> ptr(new int(1));
    
    0 讨论(0)
  • 2020-11-22 08:36

    std::unique_ptr has no copy constructor. You create an instance and then ask the std::vector to copy that instance during initialisation.

    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>]'
    

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

    The following works with the new emplace calls.

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

    See using unique_ptr with standard library containers for further reading.

    0 讨论(0)
提交回复
热议问题