c++:堆栈上的数据,而不初始化它

c++: data on stack without initializing it

本文关键字:初始化 数据 堆栈 c++      更新时间:2023-10-16

我想创建一个使用签名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和简单structs这样的类型来说足够好,但对于没有默认构造函数的更复杂的类和structs来说就失败了,因为result不能在第一行中默认初始化。问题是,如果convert中发生错误,我不使用result,如果没有发生错误,convert将自己为result分配一个初始化值(*out = {...}),所以我永远不需要自己初始化result

如何为convert提供指向适当类型的未初始化数据的指针?我知道用char[sizeof(T)]可能可以做到这一点,但我想知道是否有更优雅的解决方案。

EDIT:我现在看到这个问题违背了C++的一些基本概念,我将尝试与convert的提供商交谈,以找到解决方案。我将把这个问题留给后人

(*out = {...})这不会初始化。

赋值和初始化不是一回事。在您寻求优化的情况下,分配给未初始化的数据是UB。

您可以放置新的以进行初始化,但由于无法更改转换的主体,因此这是不允许的。

既然result无论如何都会返回,为什么不更改convert_adapter的签名呢?您可以将其作为out参数,而不是返回值:

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