Час назад я разместил ответ здесь , который, по моему мнению, был правильным.Однако мой ответ был отклонен Martin B .Он сказал
Вам просто повезло, и вы получаете нули, потому что память, в которой я находился, была инициализирована нулями.Это не гарантируется стандартом.
Однако, прочитав ответ Майкла Берра здесь и попробовав следующий пример кода
1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
Я получил ошибку отладки в MSVC ++ 2010.
Я получил похожую ошибку, когда попробовал следующий код [Мой ответ здесь ] в MSVC ++ 2010
2)
#include <cassert>
struct Struct {
std::string String;
int Int;
bool k;
// add add add
};
struct InStruct : Struct
{
InStruct() : Struct() {}
};
int main()
{
InStruct i;
assert(i.k == 0);
}
Ни (1)
, ни (2)
не выдало такой ошибки на gcc / Clang, что заставило меня задуматься, не поддерживает ли MSVC ++ 2010 C ++ 03.Я не уверен.
Согласно сообщению Майкла Барра [в C ++ 03]
new B () - значение инициализирует B, которое инициализирует нулями все поляпоскольку его ctor по умолчанию генерируется компилятором , а не определенным пользователем.
Стандарт говорит:
Для инициализации значения объекта типа Tmeans:
- если T является типом класса (раздел 9) с объявленным пользователем конструктором (12.1), , тогда конструктор по умолчанию для T называется (и инициализация некорректна, если Thas noдоступный конструктор по умолчанию);
.....
в противном случае объект инициализируется нулями
С первой точки, еслине существует объявленного пользователем конструктора по умолчанию, будет вызван синтезированный компилятором конструктор по умолчанию, который будет zero initialize
всеми полями (в соответствии с последней точкой).
Так в чем же я не прав?Правильна ли моя интерпретация инициализации значения?