Я очень смущен насчет инициализации значений и дефолтов и нулей. и особенно когда они пинают для разных стандартов С++ 03 и С++ 11 (и С++ 14).
Я цитирую и пытаюсь продлить действительно хороший ответ Value-/Default-/Zero-Init С++ 98 и С++ 03, чтобы сделать это более общий, поскольку это помогло бы многим пользователям, если бы кто-то мог помочь заполнить необходимые пробелы, чтобы иметь хороший обзор о том, что происходит, когда?
Полное описание примеров в двух словах:
Иногда память, возвращаемая новым оператором, будет инициализирована, и иногда она не зависит от того, является ли тип, который вы новичок, POD (простые старые данные), или если это класс, содержащий элементы POD, и использует созданный компилятором конструктор по умолчанию.
- В С++ 1998 существует 2 типа инициализации: ноль и значение по умолчанию
- В С++ 2003 был добавлен третий тип инициализации, инициализация значения.
- В С++ 2011/С++ 2014 была добавлена только инициализация списка, а правила для инициализации value/default//zero немного изменились.
Предположим:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;} /** only possible in c++11/14 */
struct F {F(); int m;} F::F() = default; /** only possible in c++11/14 */
В компиляторе С++ 98 должно произойти следующее::
- новое значение A - неопределенное значение (A - POD)
- new A() - zero-initialize
- new B - конструкция по умолчанию (B:: m не инициализирована, B не является POD)
- new B() - конструкция по умолчанию (B:: m не инициализирована)
- новая конструкция C по умолчанию (C:: m инициализируется нулем, C не является POD)
- new C() - конструкция по умолчанию (C:: m инициализируется нулем)
- новый D - конструктор по умолчанию (D:: m не инициализирован, D не является POD)
- new D() - конструкцию по умолчанию? (D:: m не инициализируется)
В компиляторе, совместимом с С++ 03, все должно работать так:
- новое значение A - неопределенное значение (A - POD)
- new A() - инициализировать значение A, которое является нулевой инициализацией, поскольку это POD.
- new B - инициализирует по умолчанию (оставляет B:: m неинициализированным, B не является POD)
- new B() - значение инициализирует B, который нуль инициализирует все поля, поскольку его по умолчанию ctor генерируется компилятором в отличие от пользовательского.
- new C - default - инициализирует C, который вызывает значение по умолчанию ctor. (C:: m инициализируется нулем, C не является POD)
- new C() - значение инициализирует C, который вызывает значение по умолчанию ctor. (C:: m инициализируется нулем)
- новый D - конструктор по умолчанию (D:: m не инициализирован, D не является POD)
- new D() - значение инициализирует D?, который вызывает значение по умолчанию ctor (D:: m не инициализируется)
Курсивные значения и? являются неопределенностями, пожалуйста, помогите исправить это: -)
В компиляторе, совместимом с С++ 11, все должно работать так:
??? (пожалуйста, помогите, если я начну здесь, это все равно пойдет не так)
В компиляторе, совместимом с С++ 14, все должно работать так: ??? (пожалуйста, помогите, если я начну здесь, это все равно пойдет не так) (Проект основан на ответе)
- new A - default - инициализирует A, компилятор gen. ctor, (leavs A:: m неинициализирован) (A - POD)
-
new A() - значение инициализирует A, который является нулевой инициализацией, поскольку 2. point in [dcl.init]/8
-
new B - по умолчанию инициализирует B, компилятор gen. ctor, (leavs A:: m неинициализирован) (B не является POD)
- new B() - значение инициализирует B, который нуль инициализирует все поля, поскольку его по умолчанию ctor генерируется компилятором в отличие от пользовательского.
- new C - default - инициализирует C, который вызывает значение по умолчанию ctor. (C:: m инициализируется нулем, C не является POD)
- new C() - значение инициализирует C, который вызывает значение по умолчанию ctor. (C:: m инициализируется нулем)
- new D - инициализация по умолчанию D (D:: m не инициализируется, D не является POD)
- new D() - значение инициализирует D, который вызывает значение по умолчанию ctor (D:: m не инициализируется)
- new E - default - инициализирует E, который вызывает comp. поколения. т е р. (D:: m не инициализируется, D не является POD)
- new E() - значение инициализирует E, который нуль инициализирует E, поскольку 2 точки в [dcl.init]/8)
- new F - default - инициализирует F, который вызывает comp. поколения. т е р. (D:: m не инициализируется, D не является POD)
- new F() - значение инициализирует F, который по умолчанию инициализирует F с 1. point в [dcl.init]/8 (функция предоставляется пользователем, если она объявлена пользователем и явно не дефолты или не удалены по его первой декларации. Ссылка)