我正试图在以下具有嵌套union&阵列:
struct Nested
{
union
{
short sArray[5] = {42};
float fVal; // Must NOT be initialized - obviously, only 1 member of a union can be
};
double dArray[5] = {77.7};
};
虽然代码编译得很好,但在运行/调试代码时,只有两个数组的第一个元素被初始化。。
sArray[0]设置为42,其余元素均设置为0dArray[0]设置为77.69999,剩下的都设置为0
我找到的所有其他答案都提到了实例声明中的初始化,但没有提到结构/类声明中的默认init。我还没有看到/发现gnuc++17是否启用了这种语法(也适用于数组成员(。然而,由于它编译了WO警告,人们会认为它应该是正确的。我做错什么了吗?
编辑:或者我如何简单地初始化我的数组?
您要做的是聚合初始化,这意味着sArray
和dArray
中的元素在未指定时进行值初始化。因为short
和double
是标量类型,这意味着零初始化
由于除了第一个元素外,您没有指定任何内容,因此所有剩余的元素都将初始化为0
正如评论中所要求的,初始化数组的方法是std::fill
或std::fill_n
:
#include <algorithm>
struct Nested {
explicit Nested() {
std::fill_n(sArray, 5, 0);
std::fill_n(dArray, 5, 0.0);
}
union {
short sArray[5];
float fVal; // Must NOT be initialized - obviously, only 1 member of a
// union can be
};
double dArray[5];
};
通常,我建议使用std::array
及其fill
函数:
#include <array>
struct Nested {
explicit Nested() {
sArray.fill(0);
dArray.fill(0.0);
}
union {
std::array<short, 5> sArray;
float fVal; // Must NOT be initialized - obviously, only 1 member of a
// union can be
};
std::array<double, 5> dArray;
};