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