在构造函数初始化列表中初始化 POD 类型

Initialization of POD types in constructor initialization lists

我找到很多关于 POD 类型的零初始化和默认初始化的文章和 SO 问题,但我没有找到任何讨论 POD 类型初始化为 class 成员的 class构造函数初始化列表。我确定可能有关于它的 SO 问题或文章,但我没有找到。

所以如果我有 class...

class MyClass
{
public:
   MyClass() : anArrayOfInt() {}
private:
   int anArrayOfInt[10];
}

...在构建 MyClass 对象后,我可以了解 anInt 的哪些状态?我通过经验测试注意到,在 GCC 6.4.0 上使用上述代码,anArrayOfInt 在创建 MyClass 的堆栈分配实例后全为零,但是如果我将代码更改为此:

class MyClass
{
public:
   MyClass() {}
private:
   int anArrayOfInt[10];
}

...然后堆栈分配的实例在 anArrayOfInt 中不再具有全零。在我的真实案例中(促使我写这个问题的案例),这导致了测试失败。我注意到如果我按如下方式更改代码:

class MyClass
{
public:
   MyClass() { memset(anArrayOfInt, 0, sizeof(anArrayOfInt)); }
private:
   int anArrayOfInt[10];
}

...然后我的测试再次通过,即使没有在构造函数初始化列表中列出 anArrayOfInt()。所以似乎我需要 anArrayOfInt() 在初始化列表中,但在我从 memset() 版本恢复到初始化列表版本之前,我需要确定初始化列表条目“anArrayOfInt()" 保证将 anArrayOfInt 的字节归零,或者如果这只是 GCC 的行为而我不能指望它在其他编译器上。

如果重要的话,GCC 6.4.0 是我们 运行 单元测试的地方,但我们的目标是用于 RX MCU 的 IAR 嵌入式编译器,它仍在 C++03 领域。

So if I have a class...

MyClass() : anArrayOfInt() {}

...what can I know about the state of anInt after construction of a MyClass object?

您已经对成员进行了值初始化,所以我们知道它包含零。

I need to know for certain that the initialization list entry "anArrayOfInt()" is guaranteed to zero the bytes of anArrayOfInt, or if that's just GCC's behavior and I can't count on it on other compilers.

是的,值初始化保证整数被初始化为零。