gpt4 book ai didi

c++:堆栈上的数据没有初始化

转载 作者:太空狗 更新时间:2023-10-29 22:54:42 27 4
gpt4 key购买 nike

我想创建一个使用签名函数的适配器 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 提供一个指向未初始化数据的指针到适当的类型?我知道我可能可以使用 char[sizeof(T)] 来做到这一点,但我想知道是否有更优雅的解决方案。

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

最佳答案

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

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

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

关于c++:堆栈上的数据没有初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54457575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com