将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*)>

Posted

技术标签:

【中文标题】将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*)>【英文标题】:Transfer ownership from unique_ptr<T,void(*)(T*)> to unique_ptr<const T,void(*)(const T*)> 【发布时间】:2017-02-13 21:39:02 【问题描述】:

reinterpret_cast 会是这样的:

std::unique_ptr< const T , void (*) (const T *) >
to_const ( std::unique_ptr< T , void (*) (T *) > &ptr ) 
 
  return  ptr.release() , 
           reinterpret_cast< void (*) (const T *) >( ptr.get_deleter() )  ; 

这里的deleter函数会被object调用,实际上是non-const。 但是有没有更清洁的方法可以在避免 UB 的同时进行这种传输?

【问题讨论】:

您能否更清楚地格式化您的代码? 【参考方案1】:

不以void (*)(const T *) 作为删除器类型,不。但我们可以制作自己的删除器:

template <class T>
struct ConstDeleter 
    void (*deleter)(T*);

    void operator()(T const* ptr) 
        deleter(const_cast<T*>(ptr));
    
;

std::unique_ptr<T const, ConstDeleter<T>>
to_const(std::unique_ptr<T, void (*)(T*)>& ptr)
 
  return ptr.release(), ConstDeleter<T>ptr.get_deleter();

这可以推广到任何删除器类型。

【讨论】:

以 const_cast 的名义,我重写了我非常复杂(可怕)的对象分配和构造级联中最可怕的部分。现在我想不出更清洁的方法,谢谢。

以上是关于将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*)>的主要内容,如果未能解决你的问题,请参考以下文章

为啥 unique_ptr<T> 不能从 T* 构造?

unique_ptr 比原始指针快吗? C++ [关闭]

从 unique_ptr<T> 的 void* 转换为 T** 是如何工作的?

从函数返回 unique_ptr

从函数返回 unique_ptr

从 initializer_list 构造 std::map<T, unique_ptr<S>> 时出错