Что означают следующие фразы в C ++:
нуль-инициализации,
инициализация по умолчанию, и
Значение инициализация
Что должен знать о них разработчик C ++?
c++
initialization
c++-faq
Билл
источник
источник
Ответы:
Одна вещь, которую нужно осознать, это то, что «инициализация значения» является новой в стандарте C ++ 2003 - она не существует в исходном стандарте 1998 года (я думаю, что это может быть единственным отличием, которое больше, чем пояснение). См . Ответ Кирилла В. Лядвинского на определения прямо из стандарта.
Посмотрите этот предыдущий ответ о поведении
operator new
для деталей относительно различного поведения этих типов инициализации и когда они вступают в силу (и когда они отличаются от c ++ 98 до C ++ 03):Суть ответа такова:
По меньшей мере, это довольно сложно, и когда различные методы применяются тонко.
Обязательно нужно знать, что MSVC следует правилам C ++ 98 даже в VS 2008 (VC 9 или cl.exe версии 15.x).
Следующий фрагмент показывает, что MSVC и Digital Mars следуют правилам C ++ 98, а GCC 3.4.5 и Comeau - правилам C ++ 03:
источник
int
, ноm()
в третьей строке значение инициализирует m. Важно, если вы изменитеint m;
наB m;
. :)A
иC
не используются в этом примере (они перенесены из другого связанного ответа). Даже при том, что C ++ 98 и C ++ 03 используют различную терминологию при описании того, какA
и какC
они сконструированы, результат одинаков в обоих стандартах. Толькоstruct B
приводит к другому поведению.struct C { C() : m() {}; ~C(); B m; };
, то у вас будетm.m
0. Но если он будет инициализирован по умолчанию,m
как вы говорите в C ++ 03, тоm.m
он не будет инициализирован, как в C ++ 98.C ++ 03 Стандарт 8.5 / 5:
источник