猿问

为什么我不能将唯一的PTR推回向量?

为什么我不能将唯一的PTR推回向量?

这个程序有什么问题?

#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;}

错误:

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<_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:745:6:   instantiated from 'void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::unique_ptr<int>, _Alloc = std::allocator<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:207:7: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = 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:



一只萌萌小番薯
浏览 356回答 2
2回答

慕标5832272

你需要移动unique_ptr:vec.push_back(std::move(ptr2x));unique_ptr保证unique_ptr容器拥有持有指针的所有权。这意味着您不能复制unique_ptr(因为那时有两个unique_ptr我们有所有权),所以你只能移动它。但是,请注意,您当前使用的unique_ptr是不正确的。不能使用它来管理指向局部变量的指针。局部变量的生存期是自动管理的:局部变量在块结束时被销毁(例如,当函数返回时,在本例中)。您需要动态分配对象:std::unique_ptr<int>&nbsp;ptr(new&nbsp;int(1));

牛魔王的故事

STD:UNIQUE_PTR没有复制构造函数。创建一个实例,然后询问STD:向量若要在初始化期间复制该实例,请执行以下操作。error:&nbsp;deleted&nbsp;function&nbsp;'std::unique_ptr<_Tp,&nbsp;_Tp_Deleter>::uniqu e_ptr(const&nbsp;std::unique_ptr<_Tp,&nbsp;_Tp_Deleter>&)&nbsp;[with&nbsp;_Tp&nbsp;=&nbsp;int,&nbsp;_Tp_D eleter&nbsp;=&nbsp;std::default_delete<int>,&nbsp;std::unique_ptr<_Tp,&nbsp;_Tp_Deleter>&nbsp;= &nbsp;std::unique_ptr<int>]'类满足MoveConstrucable和MoveAssignable的要求,但不满足CopyConstrucable或CopyAssignable的要求。以下内容与新的座落打电话。std::vector<&nbsp;std::unique_ptr<&nbsp;int&nbsp;>&nbsp;>&nbsp;vec;vec.emplace_back(&nbsp;new&nbsp;int(&nbsp;1984&nbsp;)&nbsp;);看见在标准库容器中使用UNIQUE_PTR进一步阅读。
随时随地看视频慕课网APP
我要回答