struct Line
{
Bounds bounds_;
Vector origin_;
uint32_t begin_;
uint32_t end_;
dist ascent_;
dist descent_;
};
使用如下:
Line line = {};
while (!parser.done()) {
line = Line(); // zero-initialize
...
}
Bounds
和Vector
是非POD类,dist
是int64_t
的typedef。
然而,VC ++ 11的优化32位版本构建似乎在while循环中至少部分line
未初始化。为什么?根据{{3}},它应该对其进行零初始化,对吗?
我将struct成员的值记录到文件中:
Line line = {};
之后:非POD类型默认初始化,其他类型为0。line = Line();
之后:POD类型仍默认初始化,其他包含随机值。答案 0 :(得分:6)
你可能已经发现了编译器错误,虽然我似乎记得在C ++ 98中初始化POD结构的要求并没有明确描述。
根据C ++ 03,表达式Line()
必须生成 value-initialised Line对象,在这种情况下,这意味着所有成员必须零初始化(因为所有成员都是标量)。
请注意,成员之间的最终填充不必设置为任何确定值,因此当您将Line对象视为一块内存时,这可能会导致误报。
解决方法是为Line
提供一个显式初始化所有成员的默认构造函数。