Unique_ptr与 lambda 删除器
Unique_ptr with lambda deleter
我有一些函数,我需要使用成员变量(自定义类的向量(。
在此函数结束时,需要清除此成员,但它需要在此函数的持续时间内保持为成员。 另一个问题是,由于程序的自定义错误处理,函数可能会过早结束。然而,该成员仍需要清除。
在这篇文章和这篇文章中使用 Ron's 的建议,我得出了以下代码:
#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 filesminggwlibgccmingw325.3.0includec++memory:81:0, from main2.cpp:3:
d:program filesminggwlibgccmingw325.3.0includec++bitsunique_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 filesminggwlibgccmingw325.3.0includec++bitsunique_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 删除器呢?
环顾四周,所以我得出了这个似乎等效的答案,但我不明白为什么它会起作用以及是什么让我的代码与众不同?
注:注:我不确定我是否应该编辑我原来的问题。 我认为这不是澄清,而是寻求进一步的建议,所以我提出了一个新问题,希望这符合规则。
您需要将cleanNumber
传递到unique_ptr
构造函数中:
auto pClean = std::unique_ptr<decltype(m_numbers), decltype(cleanNumber)>(&m_numbers, cleanNumber);
此外,您的 lambda 不会清除矢量内容,因为move(*numbers);
什么都不做。你应该写numbers->clear();
。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 从链接列表c++中删除一个项目
- 如何使用lambda作为std::unique_ptr的删除器?
- Unique_ptr与 lambda 删除器
- 使用 lambda/std::function 删除拥有该函数的对象
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 如果我在lambda中删除容纳lambda的对象,那会发生什么
- 如何避免多个删除程序 lambda
- 如何使用lambda和函数作为unique_ptr的自定义删除程序
- 使用 lambda 函数从 std::vector 中删除特定块
- 通过 lambda 删除矢量项
- C++ lambda 常量值引用在线程中删除
- C++ lambda 删除偶数
- unique_ptr<T> 用于数组专用化的 lambda 自定义删除器
- std::唯一指针和自定义lambda删除器错误
- 了解Lambda闭包类型如何删除默认构造函数
- vc2013与2015中的Lambda删除器