Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建包含唯一指针的类的std列表_C++_List_C++11_Unique Ptr - Fatal编程技术网

C++ 如何创建包含唯一指针的类的std列表

C++ 如何创建包含唯一指针的类的std列表,c++,list,c++11,unique-ptr,C++,List,C++11,Unique Ptr,我试图创建一个std列表,其中包含一个包含唯一指针的类列表。我一直收到一个错误,表示试图引用已删除的函数 我知道问题是唯一指针没有赋值运算符,list试图调用它,但我想不出一个解决方法 下面是保存指针的类的代码: class ptr_hold { public: ptr_hold(std::list<int>& _lst); std::list<int>* get_list(); private: std::unique_ptr<st

我试图创建一个std列表,其中包含一个包含唯一指针的类列表。我一直收到一个错误,表示试图引用已删除的函数

我知道问题是唯一指针没有赋值运算符,list试图调用它,但我想不出一个解决方法

下面是保存指针的类的代码:

class ptr_hold
{
public:
    ptr_hold(std::list<int>& _lst);
    std::list<int>* get_list();
private:
    std::unique_ptr<std::list<int>> num_list;
};

ptr_hold::ptr_hold(std::list<int>& _lst)
{
    num_list = std::unique_ptr<std::list<int>>(new std::list<int>(_lst));
}
class ptr\u保持
{
公众:
ptr_保持(标准:列表和列表);
std::list*get_list();
私人:
std::唯一的\u ptr num\u列表;
};
ptr_保持::ptr_保持(标准::列表和列表)
{
num_list=std::unique_ptr(新std::list(_lst));
}
下面是尝试执行分配的示例代码:

list<int> lst;
for (int i = 0; i < 5; i++)
{
    lst.push_back(i);
}
ptr_hold ph = ptr_hold(lst);

list<ptr_hold> ph_list;
ph_list.push_back(ph); //error
ph_list.push_back(move(ph)); //error
列表lst;
对于(int i=0;i<5;i++)
{
一、推回(一);
}
ptr_保持ph=ptr_保持(lst);
列表PHU列表;
PHU列表。将PHU向后推(ph)//错误
ph_列表。推回(移动(ph))//错误

如何处理此问题?

好吧,您很可能正在使用VS,因为它不会自动为您生成移动成员函数。(否则
ph\u列表。向后推(移动(ph))
会起作用。)

unique\u ptr
没有移动分配运算符,这意味着所有权转移。要调用移动赋值操作符(或移动构造函数),您需要使用右值。(
T&&
,其中
T
在这里不作为模板,因为它调用了一些不同的东西)要获得右值,您要么使用临时值(例如函数的返回值),要么必须手动将左值强制转换为右值。这是通过
std::move
(表示意图)或更冗长的
static\u cast
实现的

要解决此问题,请使用
emplace\u back
或手动声明正确的构造函数,并使用
emplace\u back
push\u back(move())

---编辑---

注意:
emplace\u back
可能不需要移动分配构造函数才能工作,但在尝试从列表中提取对象时会遇到麻烦。

ph\u list.emplace\u back(lst)实际上,
ph\u列表。向后推(移动(ph))对我来说很好。但是
emplace\u back
更好。@dyp注意到并更改了,谢谢。另外,我发誓我是从你评论之前的答案开始的。顺便说一句,你不需要在编辑部分答案时添加“-edit--”或“[edit]”,在阅读答案时,会有一个通知,其他人也会收到通知,而且答案已经被编辑过。@dyp我知道,但我觉得它的目的是快速直观地指示应该在帖子中注明的变更,或者可能是以后对备注/备注的想法。(或者可能是我从不同的论坛上理顺了一个习惯。:-)我试着在有移动功能和没有移动功能的情况下重新安置你,但这对我来说都不起作用。我对右值不熟悉,所以我现在正在仔细阅读。