Инициализация значения и типы без POD

Час назад я отправил ответ здесь , который, по моему мнению, было правильно. Однако мой ответ был отвергнут Мартином Б. . Он сказал

, что вам просто повезло, и вы получаете нули, потому что память, в которую я был помещен, была инициализирована нулями. Стандарт не гарантирует этого.

Однако, прочитав ответ Майкла Бёрра здесь и попробовав следующий пример кода

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 (и инициализация неверна, если нет доступного конструктора по умолчанию);

.....

в противном случае объект инициализируется нулем

С первой точки, если не существует объявленного пользователем конструктора по умолчанию, будет вызван синтезированный компилятором конструктор по умолчанию, который инициализирует ноль все поля (согласно последней точке).

Итак, где я ошибаюсь ? Верна ли моя интерпретация инициализации значения?

17
задан ledonter 15 June 2017 в 17:49
поделиться