为什么指定的初始化程序零初始化数据成员



以下来自指定初始化程序的cppref:

struct A { int x; int y; int z; };
A b{.x = 1, .z = 2}; // ok, b.y initialized to 0

默认情况下,所有基本类型都是默认初始化的,而不是C++中的零初始化。

为什么指定的初始化程序零初始化数据成员

b.y将从一个空的初始值设定项列表中初始化,作为效果,零初始化为0

对于非并集聚合,当初始化器子句的数量小于成员的数量时,未提供指定初始化器的元素将与上述相同地初始化(如果提供了默认成员初始化器,则为空列表初始化(:

struct A {
string str;
int n = 42;
int m = -1;
};
A{.m=21}  // Initializes str with {}, which calls the default constructor
// then initializes n with = 42
// then initializes m with = 21

根据标准,[dcl.init.agr]/5:

对于非并集聚合,每个不是显式初始化的元素初始化如下:

  • (5.1(如果元素有默认的成员初始值设定项([class.mem](,则从该初始值设定值初始化元素。

  • (5.2(否则,如果元素不是引用,则从空的初始化器列表([dcl.init.list](复制初始化该元素。

  • (5.3(否则,程序不正确。

列表初始化中没有初始化器(也没有默认成员初始化器(的子对象(在A是聚合的情况下是聚合初始化(是值初始化(在int子对象的情况下为零初始化(。它们不是默认初始化的。

指定初始化程序之前就是这种情况,使用指定初始化程序时仍然是这种情况。示例:

struct A { int x; int y; int z; };
A b0;                  // default i.e. no initialisation for x,y,z
A b1 {};               // x, y and z are value initialised
A b2 {1};              //    y and z are value initialised
A b3 {.x = 1, .z = 2}; //    y       is  value initialised

同样适用于数组,尽管遗憾的是,在标准C++:中没有指定的初始化程序

int arr0[3];          // default i.e. no initialisation
int arr1[3] {};       // all are value initialised
int arr2[3] {42};     // all but first are value initialised

最新更新