如何制作unique_ptr和自定义删除器的副本

阿洛克

如果使用自定义deleter复制unique_ptr,则会出现编译错误。请有人帮助我。

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

auto del = [](int *p) { cout <<"obj deleted "<<endl;delete p;};
int main()
{
   unique_ptr<int, decltype(del)> p1(new int(10), del);
   unique_ptr<int,decltype(del)> p2;
   p2 = std::move(p1);
}

错误:

C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\tuple||In instantiation of 'constexpr std::_Head_base<_Idx, _Head, true>::_Head_base() [with unsigned int _Idx = 1u; _Head = <lambda(int*)>]':|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\tuple|353|required from 'constexpr std::_Tuple_impl<_Idx, _Head>::_Tuple_impl() [with unsigned int _Idx = 1u; _Head = <lambda(int*)>]'|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\tuple|202|required from 'constexpr std::_Tuple_impl<_Idx, _Head, _Tail ...>::_Tuple_impl() [with unsigned int _Idx = 0u; _Head = int*; _Tail = {<lambda(int*)>}]'|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\tuple|602|required from 'constexpr std::tuple<_T1, _T2>::tuple() [with _T1 = int*; _T2 = <lambda(int*)>]'|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\unique_ptr.h|158|required from 'constexpr std::unique_ptr<_Tp, _Dp>::unique_ptr() [with _Tp = int; _Dp = <lambda(int*)>]'|
F:\3d\C++CodeProject\Hello\main.cpp|10|required from here|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\tuple|59|error: use of deleted function '<lambda(int*)>::<lambda>()'|
F:\3d\C++CodeProject\Hello\main.cpp|6|note: a lambda closure type has a deleted default constructor|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\unique_ptr.h||In instantiation of 'std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(std::unique_ptr<_Tp, _Dp>&&) [with _Tp = int; _Dp = <lambda(int*)>]':|
F:\3d\C++CodeProject\Hello\main.cpp|11|required from here|
C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\5.1.0\include\c++\bits\unique_ptr.h|252|error: use of deleted function '<lambda(int*)>&<lambda(int*)>::operator=(const<lambda(int*)>&)'|
F:\3d\C++CodeProject\Hello\main.cpp|6|note: a lambda closure type has a deleted copy assignment operator|
||=== Build failed: 2 error(s), 8 warning(s) (0 minute(s), 1 second(s)) ===|
保罗·贝朗格

声明的问题p2在于lambda的类型不是默认可构造的因此,指针类型的每个声明都需要具有传递给它的删除器实例。

您可以通过将删除程序lambda替换为默认的可构造函子结构来解决此问题。然后,指针类型的每个实例将能够创建其自己的deleter对象的实例。

struct MyDeleter
{
    void operator()(int* p){cout << "deleted" << endl; delete p;}
};

int main()
{
    //don't need to specify an instance of the deleter since it is default_constructible.
    unique_ptr<int, MyDeleter> p1(new int(10)); 
    unique_ptr<int, MyDeleter> p2;
    p2 = std::move(p1);
}

编辑:如@super所说,分配行的问题还在于(c ++ 20之前)lambda也不是CopyAssignable我在上面发布的函子方法解决了这两个问题。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

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

unique_ptr 的有状态自定义删除器

unique_ptr,自定义删除器和零规则

std :: unique_ptr <T []>和自定义分配器删除器

混淆使用unique_ptr和自定义删除器

std :: unique_ptr,自定义删除器和类型更改

如何在C ++ 11中返回包含自定义删除器的std :: unique_ptr?

如何为由 unique_ptr 管理的数组编写自定义删除器?

如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

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

智能指针(unique_ptr)自定义删除器错误C2027和C2338

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

如何将自定义删除器与std :: unique_ptr成员一起使用?

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

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

使用自定义删除器在地图中存储unique_ptr

使用typedef为std :: unique_ptr指定自定义默认删除器

初级 5 版。来自自定义删除器函数的 unique_ptr 构造函数

使用std :: function对象将自定义删除器传递给std :: unique_ptr

未调用std :: unique_ptr中的自定义删除器

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

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

了解采用自定义删除器的unique_ptr的构造函数

指向重载静态成员的函数指针 - 在 unique_ptr 中用作自定义删除器

初始化传递给unique_ptr自定义删除器的函子

如何安全地重载std :: unique_ptr的自定义删除程序?

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

使用内存池中的自定义删除器将 std::unique_ptr 返回到抽象类型

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