假设我有一个看起来像
的函数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工作?
答案 0 :(得分:8)
unique_ptr
拥有删除器,它负责在指针上执行delete
- 表达式(或delete[]
- 表达式),当生命周期为unique_ptr
结束。
但delete p
为p
时的void*
表达式无效。
因此unique_ptr
的默认功能不支持void*
。我不确定是否明确被禁止或没有unique_ptr<void>
。但如果它不被禁止,那么试图定义一个自定义删除器来完成这项工作,就不会很聪明。
而是修复设计。
首先不要丢弃类型信息。