Час назад я отправил ответ здесь , который, по моему мнению, было правильно. Однако мой ответ был отвергнут Мартином Б. . Он сказал
, что вам просто повезло, и вы получаете нули, потому что память, в которую я был помещен, была инициализирована нулями. Стандарт не гарантирует этого.
Однако, прочитав ответ Майкла Бёрра здесь и попробовав следующий пример кода
1)
#include
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
, я получил ошибку отладки на MSVC ++ 2010.
Я получил аналогичную ошибку при попытке следующий код [Мой ответ здесь ] на MSVC ++ 2010
2)
#include
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 по умолчанию генерируется компилятором в отличие от определяемого пользователем.
Стандарт говорит
Для инициализации значения объекта типа T означает:
- если T является типом класса (пункт 9) с конструктором, объявленным пользователем (12.1) , , то вызывается конструктор по умолчанию для T (и инициализация неверна, если нет доступного конструктора по умолчанию);
.....
в противном случае объект инициализируется нулем
С первой точки, если не существует объявленного пользователем конструктора по умолчанию, будет вызван синтезированный компилятором конструктор по умолчанию, который инициализирует ноль
все поля (согласно последней точке).
Итак, где я ошибаюсь ? Верна ли моя интерпретация инициализации значения?