如何将int unique_ptr转换为void unique_ptr?

时间:2016-11-08 01:28:15

标签: c++ c++11

假设我有一个看起来像

的函数
void *func(){
    int *a = new int;
    *a = 1;

    void *b = a;
    return b;
}

在我的主要功能中我可以像

一样使用它
int *test = reinterpret_cast<int *>(func());
std::cout << test[0] << std::endl;
delete test;

它将打印正确的结果。假设我想将unique_ptr用于我的函数,因此它变为

std::unique_ptr<void> func(){
    std::unique_ptr<int> a(new int);
    *a = 1;

    std::unique_ptr<void> b = a; // does not compile
    return b;
}

抛出编译错误

error: conversion from ‘std::unique_ptr<int>’ to non-scalar type ‘std::unique_ptr<void>’ requested

在这种情况下,我该怎么做才能使unique_ptr工作?

1 个答案:

答案 0 :(得分:8)

unique_ptr拥有删除器,它负责在指针上执行delete - 表达式(或delete[] - 表达式),当生命周期为unique_ptr结束。

delete pp时的void*表达式无效。

因此unique_ptr的默认功能不支持void*。我不确定是否明确被禁止或没有unique_ptr<void>。但如果它不被禁止,那么试图定义一个自定义删除器来完成这项工作,就不会很聪明。

而是修复设计。

首先不要丢弃类型信息。