繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM