c++ - c ++:堆栈上的数据而不对其进行初始化
问题描述
我想创建一个使用签名函数的适配器,void convert(void* input, T* out, int* ok)
其中 T 被重载为任何类型,并ok
指示是否发生错误(提供了这些函数,我无法更改它们的主体)。模板内的功能片段:
template<typename T>
T convert_adapter(void* input){
T result;
int ok = 1;
convert(input, &result, &ok);
if (!ok)
throw Exception("error during conversion");
return result;
}
这对于像 int 和简单结构这样的类型足够好,但在没有默认构造函数的更复杂的类和结构上失败,因为result
不能在第一行默认初始化。问题是,如果 中发生错误convert
,我不会使用result
,如果没有发生错误,则会自行convert
分配一个初始化值( ),因此我永远不需要实际初始化自己。result
*out = {...}
result
如何提供convert
指向适当类型的未初始化数据的指针?我知道我可能可以用 a 来做到这一点char[sizeof(T)]
,但我想知道是否有更优雅的解决方案。
编辑:我现在看到这个问题违背了 C++ 的一些基本概念,我将尝试与提供者交谈convert
以找到解决方案。我会把这个问题留给后代。
解决方案
(*out = {...})
这不会初始化。
赋值和初始化不是一回事。在您寻求优化的情况下,分配给未初始化的数据是 UB。
您可以放置 new 进行初始化,但由于您无法更改转换的主体,因此这是不允许的。
推荐阅读
- javascript - hpe_invalid_header_token(bytesParsed: 17) 向 php 请求 NodeJs 时出错
- angular - Angular Ivy 编译器和 webpack
- android - 如何将recyclerview项目自动适应屏幕android的宽度?
- sapui5 - 属性绑定通过控制器与硬编码文本结合
- mysql - 如何在 mysql 案例函数中执行子查询?
- c - 如何编写一个清理文件夹的函数?
- string - 如何在scala中将长十六进制字符串转换为BigInt
- python - 如何有效地将大图像分成几个部分并旋转它们?
- html - 如何从视图将模型发布到控制器?
- react-native - 如何在 UI react-native Flatlist 中显示音频播放器