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
является typedef для int64_t
,
Тем не менее, оптимизированная 32-разрядная версия VC ++ 11, кажется, оставляет по крайней мере часть line
неинициализирован внутри цикла while. Зачем? В соответствии с Есть ли в скобках после имени типа разница с новым?, он должен был инициализироваться нулем, верно?
Я записываю значения членов структуры в файл:
Line line = {};
: не POD-типы инициализируются по умолчанию, остальные 0.line = Line();
: POD-типы по-прежнему инициализированы по умолчанию, другие содержат случайные значения.Возможно, вы обнаружили ошибку компилятора, хотя я, кажется, помню, что в C ++ 98 требования для инициализации структур POD не были так четко описаны.
Согласно C ++ 03, выражение Line()
должен привести к Значение инициализирован Объект Line, который в данном случае означает, что все члены должны быть нулевой инициализируется (так как все члены скаляры).
Обратите внимание, что возможное заполнение между членами не обязательно должно иметь какое-либо определенное значение, так что это может привести к ложному срабатыванию, если вы посмотрите на объект Line как каплю памяти.
Обходной путь должен предоставить конструктор по умолчанию для Line
это явно инициализирует всех членов.
Других решений пока нет …