带有lambda删除的Unique_ptr

时间:2017-07-18 10:29:12

标签: c++ lambda

我有一些功能需要使用成员变量(自定义类的向量) 在此函数结束时,需要清除此成员,但它需要在此函数期间保留为成员。 另一个问题是由于程序的自定义错误处理,该功能可能过早结束。但该成员仍需要被清除。

使用Ron's advice in this postthis so post我来到了以下代码:

#include <iostream>
#include <vector>
#include <memory>
using namespace std;

class A
{
public:
    A()
    {
        m_numbers = { { 3, 1 ,4, 1, 5} };
    }

    void display()
    {
        auto cleanNumber = [](decltype(m_numbers)* numbers){ 
            if(numbers) 
                move(*numbers);
        };
        auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers);
        for(int number: m_numbers)
            cout << number << endl;
    }
private:
    vector<int> m_numbers;
};

int main()
{
    A a;
    a.display();
    cout << "should be empty now" << endl;
    a.display();
    return 0;
}

这会出现以下错误:(对不起格式化)

g++ -std=c++17 -o main2 main2.cpp                                   
In file included from d:\program files\minggw\lib\gcc\mingw32\5.3.0\include\c++\memory:81:0, from main2.cpp:3:
d:\program files\minggw\lib\gcc\mingw32\5.3.0\include\c++\bits\unique_ptr.h: 
In instantiation of 'std::unique_ptr<_Tp, _Dp>::unique_ptr(std::unique_ptr<_Tp, _Dp>::pointer) 
[with _Tp = std::vector<int>; _Dp = A::display()::<lambda(std::vector<int>*)>; std::unique_ptr<_Tp, _Dp>::pointer = std::vector<int>*]':
main2.cpp:20:87:   required from here 
d:\program files\minggw\lib\gcc\mingw32\5.3.0\include\c++\bits\unique_ptr.h:170:33: 
error: use of deleted function 'A::display()::<lambda(std::vector<int>*)>::<lambda>()'
: _M_t(__p, deleter_type()) 
 main2.cpp:16:23: note: a lambda closure type has a deleted default constructor
 auto cleanNumber = [](decltype(m_numbers)* numbers){

我想我明白,由于默认构造函数被删除,我无法传递此lambda的decltype。我如何传递正确的lambda删除器?

环顾四周,所以我来到了this answer这似乎是等价的,但我不明白为什么会这样做以及是什么让我的代码与众不同?

n.b。我不确定我是否应该编辑我的原始问题。 我认为这不是澄清,而是要求进一步的建议,所以我提出了一个新的问题,希望这符合规则。

1 个答案:

答案 0 :(得分:1)

您需要将cleanNumber传递给unique_ptr构造函数:

auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers, cleanNumber);

此外,您的lambda不会清除矢量内容,因为move(*numbers);什么都不做。您应该改为numbers->clear();