Я очень запутался в инициализации значений, значений по умолчанию и нуля. и особенно когда они вступают в силу для различных стандартов C ++ 03 и C ++ 11 (и C ++ 14).
Я цитирую и пытаюсь дать действительно хороший ответ Value- / Default- / Zero- Init C ++ 98 и C ++ 03 здесь, чтобы сделать его более общим, поскольку это поможет много пользователей, если бы кто-нибудь мог помочь заполнить необходимые пробелы, чтобы иметь хорошее представление о том, что и когда происходит?
Краткое описание примеров:
Иногда память, возвращаемая оператором new, будет инициализирована, а иногда это не будет зависеть от того, является ли новый тип POD (простые старые данные), или если это класс, содержащий члены POD и использующий конструктор по умолчанию, созданный компилятором.
- В C ++ 1998 существует 2 типа инициализации: ноль- и инициализация по умолчанию.
- В C ++ 2003 был добавлен третий тип инициализации, инициализация значения.
- В C ++ 2011 / C ++ 2014 была добавлена только инициализация списка и правила для инициализации значения / по умолчанию / нуля немного изменилось.
Предполагать:
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 */
В компиляторе C ++ 98 должно произойти следующее:
new A
- неопределенное значение (A
- POD)new A()
- нулевая инициализацияnew B
- конструкция по умолчанию (B::m
не инициализирован,B
не-POD)new B()
- конструкция по умолчанию (B::m
не инициализирован)new C
- конструкция по умолчанию (C::m
инициализируется нулем,C
не является POD)new C()
- конструкция по умолчанию (C::m
инициализируется нулем)new D
- конструкция по умолчанию (D::m
не инициализирован,D
не-POD)new D()
- конструкция по умолчанию? (D::m
не инициализирован)
В компиляторе, совместимом с C ++ 03, все должно работать следующим образом:
new A
- неопределенное значение (A
- POD)new A()
- инициализация значенияA
, что является нулевой инициализацией, поскольку это POD.new B
- инициализируется по умолчанию (оставляетB::m
неинициализированным,B
не-POD)new B()
- инициализирует значениеB
, которое инициализирует нулем все поля, поскольку его ctor по умолчанию генерируется компилятором, а не определенным пользователем.new C
- инициализирует по умолчаниюC
, который вызывает ctor по умолчанию. (C::m
инициализирован нулем,C
не является POD)new C()
- инициализирует значениеC
, которое вызывает ctor по умолчанию. (C::m
инициализируется нулем)new D
- конструкция по умолчанию (D::m
не инициализирован,D
не-POD)new D()
- инициализирует значение D?, которое вызывает ctor по умолчанию (D::m
не инициализирован)
Значения курсивом и? есть сомнения, пожалуйста, помогите исправить это :-)
В компиляторе, совместимом с C ++ 11, все должно работать следующим образом:
??? (пожалуйста, помогите, если я начну здесь, все равно пойдет не так)
В компиляторе, совместимом с C ++ 14, все должно работать так: ??? (помогите, пожалуйста, если я начну здесь, все равно пойдет не так) (Черновик на основе ответа)
new A
- инициализируется по умолчаниюA
, компилятор gen. ctor, (оставляетA::m
неинициализированным) (A
- POD)new A()
- инициализирует значениеA
, что является нулевой инициализацией с момента 2. точки в [dcl.init] / 8new B
- инициализируется по умолчаниюB
, компилятор gen. ctor, (оставляетB::m
неинициализированным) (B
не является POD)new B()
- инициализирует значениеB
, которое инициализирует нулем все поля, поскольку его ctor по умолчанию генерируется компилятором, а не определенным пользователем.new C
- инициализирует по умолчанию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
- инициализирует по умолчаниюE
, который вызывает comp. ген. ctor. (E::m
не инициализирован, E не является POD)new E()
- инициализирует значениеE
, которое инициализирует нулемE
, начиная с 2 точки в [dcl.init] / 8)new F
- инициализирует по умолчаниюF
, который вызывает comp. ген. ctor. (F::m
не инициализирован,F
не является POD)new F()
- инициализирует значениеF
, которое инициализирует по умолчаниюF
с 1. точки в [dcl.init] / 8 (F
функция ctor предоставляется пользователем, если это пользователь -объявлен и явно не задан по умолчанию или не удален при первом объявлении. Ссылка а>)
struct D { D() {}; int m; };
, возможно, стоит включить в ваш список. - person Yakk - Adam Nevraumont   schedule 21.04.2015