[英]c++: data on stack without initializing it
我想创建一个使用签名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
指向未初始化数据的指针convert
为适当的类型? 我知道我可以用char[sizeof(T)]
做到这一点,但我想知道是否有一个更优雅的解决方案。
编辑:我现在看到这个问题违背了C ++的一些基本概念,我将尝试与convert
提供商讨论以找到解决方案。 我将把这个问题留给子孙后代。
(*out = {...})
这不会初始化。
分配和初始化不是一回事。 在您寻求优化的情况下,分配给未初始化的数据是UB。
您可以将new放置为初始化,但由于您无法更改转换体,因此不允许这样做。
既然result
仍然返回,为什么不更改convert_adapter
的签名? 您可以将其作为out-parameter而不是返回值:
template<typename T>
convert_adapter(void* input, T* result){
int ok = 1;
convert(input, result, &ok);
if (!ok)
throw Exception("error during conversion");
return;
}
这样,您可以在convert_adapter
之外初始化result
,您可以在其中使用非默认构造函数。 类型T
的变量必须存在,无论如何都要调用convert_adapter
,因为您可能想要将结果赋值给某些东西。
T result(non,default,contructor,parameter,values);
//result = convert_adapter(input); // old
convert_adapter(input, &result); // new
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.