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和简单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
相关文章:
- 如何使用数据对象上的常量指针初始化类
- 如何在 malloc 内存中初始化非 POD 数据
- 内联静态数据的初始化
- 是否可以使用右值初始化数据成员?
- 构造函数正在初始化数据成员
- 初始化数据成员取决于构造函数中的条件
- openGL如何处理发送给它的空/未初始化数据?
- 如何在C 11中正确初始化数据成员
- 在具有初始化的声明中,是否可以使用对未初始化数据的引用
- 使用值初始化的数组对零初始化数据
- 在C++中,如果我们不在构造函数中初始化数据成员,那么类中数据成员的值会是多少
- 为什么我们需要构造函数 C++,我们可以通过函数(初始化数据或访问私有数据成员)来做同样的事情
- 正在初始化数据文件中的静态常量成员
- 用成员函数初始化数据成员
- 在不初始化数据的情况下调整 std::vector C++的大小<char>
- 尝试在构造函数中初始化数据成员,但失败.为什么
- 在c++中使用初始化列表初始化数据成员引用
- 如何创建一个可以初始化c++数据类型的类
- 当初始化数据类型char*和非char*时
- 代码是否被视为可移植可执行文件格式中的初始化数据,初始化数据和单元化数据之间的确切区别是什么