如何在C ++中返回unique_ptr的列表?

时间:2018-07-30 08:13:35

标签: c++ c++14 smart-pointers

这是一个代码段,我想从一个函数中获取unique_ptr的列表。尽管我已经向该结构添加了Copy / move构造函数,但是vs编译器仍然报告了c2280错误(试图引用已删除的函数)。有人知道这是怎么回事吗?

#include<iostream>
#include<memory>
#include <list>
using namespace std;
struct info {
    info() {
        cout << "c" << endl;
    }
    ~info() {}
    info(const info&w) {
        cout << "cc" << endl;
    }
    info(const info&&w) {
        cout << "ccc" << endl;
    }
    info& operator==(const info&) {
        cout << "=" << endl;
    }
    info& operator==(const info&&) {
        cout << "==" << endl;
    }
};

typedef unique_ptr<info> infop;

list<infop> test() {
    list<infop> infopList;
    info t,t1;
    infop w = make_unique<info>(t);
    infop w1 = make_unique<info>(t1);
    infopList.push_back(w);
    infopList.push_back(w1);
    return infopList;
}

void main() {
    list<infop> pl = test();
}

1 个答案:

答案 0 :(得分:1)

首先,您的move构造函数/ move赋值运算符不应将其参数用作const,这在您move时“窃取”变量的成员以实现高效的意义上没有意义。构造其他变量,当您从const移开时,您将无法执行此操作。

问题在于您正在为结构info以及在使用

时进行复制/移动运算符
infopList.push_back(w);
infopList.push_back(w1);

您正在尝试制作unique_ptr<info>的副本,unique_ptr没有副本构造函数,只有move构造函数,您需要移动变量。

infopList.push_back(std::move(w));
infopList.push_back(std::move(w1));