在结构嵌套的联合/数组成员中,默认初始化编译,但没有正确进行



我正试图在以下具有嵌套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警告,人们会认为它应该是正确的。我做错什么了吗?

编辑:或者我如何简单地初始化我的数组?

您要做的是聚合初始化,这意味着sArraydArray中的元素在未指定时进行值初始化。因为shortdouble是标量类型,这意味着零初始化

由于除了第一个元素外,您没有指定任何内容,因此所有剩余的元素都将初始化为0

正如评论中所要求的,初始化数组的方法是std::fillstd::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;
};

最新更新