带有 lambda 删除器的 Unique_ptr

图罗尼

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

使用Ron 在这篇文章这篇文章中的建议,我得到了以下代码:

#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 删除器呢?

环顾四周,所以我得出了这个似乎等效的答案,但我不明白为什么会这样,以及是什么使我的代码不同?

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

用户7860670

你需要传递cleanNumberunique_ptr构造函数:

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

此外,您的 lambda 不会像move(*numbers);什么一样清除矢量内容你应该写numbers->clear();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有lambda自定义删除程序的std :: unique_ptr无法编译

带有unique_ptr捕获的asio lambda

unique_ptr 的有状态自定义删除器

没有op删除unique_ptr

使用带有unique_ptr的自定义删除器

std :: unique_ptr使用带有很少参数的自定义删除器

无法使用带有std :: move的自定义删除器插入std :: unique_ptr

无法将带有NULL删除器的std :: unique_ptr移动到std :: shared_ptr?

unique_ptr 的 lambda 删除器导致编译错误 vs 函子

如何使用lambda和功能作为unique_ptr的自定义删除器

将带有unique_ptr的可变lambda传递给const&std :: function

将具有自定义删除器的unique_ptr移到shared_ptr

具有自定义删除器的unique_ptr构造函数被删除

为什么带有shared_ptr的带有自定义删除器的unique_ptr不适用于nullptr?

没有unique_ptr的现代C ++构建器模式

具有std :: unique_ptr的容器的访问器函数

如果需要存储删除器,unique_ptr如何没有开销?

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

Typedef一个带有静态自定义删除器的shared_ptr类型,类似于unique_ptr

带有 unique_ptr 的工厂模式

如果使用lambda,std :: unique_ptr如何没有大小开销

删除函数unique_ptr

删除器类型在unique_ptr与shared_ptr中

为什么我的unique_ptr认为有一个空函数指针删除器?

是否有一种方便的方法来使unique_ptr自动具有诸如shared_ptr的删除器?

配备有功能指针作为自定义删除器的unique_ptr是否与shared_ptr大小相同?

std :: unique_ptr <T []>具有派生对象的数组,使用已删除的函数

如何使用删除器调用unique_ptr构造函数?

如何使用静态删除器创建 unique_ptr