在代码中,我为特定对象定义了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)尚不清楚。

08-06 14:46