我对value-&default-&zero-initialization感到非常困惑。特别是当他们采用不同的标准C ++ 03和C ++ 11(和C ++ 14)时。
我在这里引用并尝试扩展一个很好的答案Value- / Default- / Zero-Init C ++ 98和C ++ 03,使其更通用,因为如果有人可以帮助填写,它将对很多用户有所帮助需要差距才能很好地了解何时会发生什么?
简而言之,通过示例全面了解:
有时由new运算符返回的内存将被初始化,有时并不取决于您要更新的类型是POD(普通旧数据),还是它是包含POD成员并且正在使用a的类。编译器生成的默认构造函数。
- 在C ++ 1998中,有两种初始化类型:零初始化和默认初始化
- 在C ++ 2003中,第三种初始化类型是值初始化。
- 在C ++ 2011 / C ++ 2014中,仅添加了列表初始化,并且value- / default- / zero-initialization的规则有所更改。
承担:
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
-default -initializes ,它调用默认的ctor。(C::m
为零初始化,C
为非POD)new C()
C
-value -initializes ,它调用默认的ctor。(C::m
零初始化)new D
-默认构造(D::m
未初始化,D
非POD)new D()
-值是否初始化D?,它会调用默认的ctor(D::m
未初始化)
斜体值和?有不确定性,请帮助纠正此问题:-)
在符合C ++ 11的编译器中,事情应该像这样运行:
??? (如果我从这里开始,请帮忙,否则还是会出错)
在C ++ 14符合的编译器,事情应该像这样: ??? (如果我从这里开始,请务必提供帮助,否则会出错) (根据答案起草)
new A
-default-initializesA
,编译器生成。ctor,(A::m
未初始化的叶子)(A
是POD)new A()
-值初始化A
,这是因为在2点的零初始化[dcl.init] / 8new B
-default-initializesB
,编译器生成。ctor,(B::m
未初始化的叶子)(B
是非POD)new B()
-值初始化B
,将所有字段归零,因为它的默认ctor是由编译器生成的,而不是用户定义的。new C
C
-default -initializes ,它调用默认的ctor。(C::m
为零初始化,C
为非POD)new C()
C
-value -initializes ,它调用默认的ctor。(C::m
零初始化)new D
-default-initializesD
(D::m
未初始化,D
是非POD)new D()
D
-value -initializes ,它调用默认的ctor(D::m
未初始化)new E
-default-initializesE
,它调用comp。gen。ctor。(E::m
未初始化,E为非POD)new E()
-值初始化E
,其零初始化E
因为在2点[dcl.init] / 8)new F
-default-initializesF
,它调用comp。gen。ctor。(F::m
未初始化,F
是非POD)new F()
-值初始化F
,其缺省初始化F
自1点[dcl.init] / 8(F
ctor的功能是用户提供的,如果它是用户声明的和未明确拖欠或在其第一声明删除。链接)