Нулевая инициализация POD

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-типы по-прежнему инициализированы по умолчанию, другие содержат случайные значения.

6

Решение

Возможно, вы обнаружили ошибку компилятора, хотя я, кажется, помню, что в C ++ 98 требования для инициализации структур POD не были так четко описаны.

Согласно C ++ 03, выражение Line() должен привести к Значение инициализирован Объект Line, который в данном случае означает, что все члены должны быть нулевой инициализируется (так как все члены скаляры).

Обратите внимание, что возможное заполнение между членами не обязательно должно иметь какое-либо определенное значение, так что это может привести к ложному срабатыванию, если вы посмотрите на объект Line как каплю памяти.

Обходной путь должен предоставить конструктор по умолчанию для Line это явно инициализирует всех членов.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]