在代码中,我为特定对象定义了3种std::unique_ptr指针类型:
typedef std::unique_ptr<MyObject> nonConstPtrDefaultDelete;
typedef std::unique_ptr<MyObject, std::function<void(MyObject *)>>
nonConstPtrCustomDelete;
typedef std::unique_ptr<const MyObject, std::function<void(const MyObject *)>>
ConstPtrCustomDelete;
我遇到了一个用例,其中需要将nonConstPtrDefaultDelete转换为ConstPtrCustomDelete以及将nonConstPtrCustomDelete转换为ConstPtrCustomDelete。
换一种说法:
nonConstPtrDefaultDelete a;
nonConstPtrCustomDelete b;
ConstPtrCustomDelete c1(a); // Compiler error Deleter has incompatible type
ConstPtrCustomDelete c2(b); // Compiler error Deleter has incompatible type
主要问题来自删除功能的类型签名不兼容。可以通过以下方式更改nonConstPtrCustomDelete类型的定义来修复nonConstPtrCustomDelete情况:
typedef std::unique_ptr<MyObject, std::function<void(const MyObject *)>>
nonConstPtrCustomDelete
但是,尽管直观上很明显可以进行转换,但使用DefaultDelete的最常见情况仍然产生编译错误。
有没有一种解决方法,可以限制并提示编译器函数可以从一个转换为另一个?
谢谢
最佳答案
如果确定删除器正确,则可以将DefaultDelete转换为您的类型:
nonConstPtrDefaultDelete a;
ConstPtrCustomDelete c1( a.release(), your_deleter );
与const/non const版本相同。但是,为什么需要两个版本(一个用于const,一个用于非const)尚不清楚。