我正在使用 RAD studio 10.2 附带的 clang 编译器(我认为是 c++ 11)。我今天错误地发现结构或数组的前 n 个成员可以使用通常的大括号进行分配,例如
int a[500]={1};
struct {int a,b,c;} st={2,3};
上面的编译和工作正常,但我从来没有遇到过这个,也没有见过它以前使用过,我在网上找不到它的提及(也许我正在使用错误的措辞类型进行搜索)。这个 c++ 记录了吗?
我正在使用 RAD studio 10.2 附带的 clang 编译器(我认为是 c++ 11)。我今天错误地发现结构或数组的前 n 个成员可以使用通常的大括号进行分配,例如
int a[500]={1};
struct {int a,b,c;} st={2,3};
上面的编译和工作正常,但我从来没有遇到过这个,也没有见过它以前使用过,我在网上找不到它的提及(也许我正在使用错误的措辞类型进行搜索)。这个 c++ 记录了吗?
对于聚合初始化,
(强调我的)
如果初始化子句的数量小于成员的数量
and bases (since C++17)
或初始化列表完全为空,则剩余的成员由空列表and bases (since C++17)
初始化by their default member initializers, if provided in the class definition, and otherwise (since C++14)
,按照通常的列表初始化规则(对非类类型执行值初始化和具有默认构造函数的非聚合类,以及聚合的聚合初始化)。
这意味着,对于int a[500]={1};
,第一个元素被初始化为1
,而数组的其余 499 个元素被初始化为0
。对于struct {int a,b,c;} st={2,3};
,成员a
被初始化为2
,最后一个成员也被初始化为。b
3
c
0
我从来没有遇到过这个,也没有见过它使用过,我在网上找不到它的提及(也许我正在使用错误的措辞类型进行搜索)。这个 c++ 记录了吗?
是的,这是记录在案的。这种语法称为列表初始化 - 更具体地说,因为类型是聚合:这是聚合初始化。
仅初始化结构或数组的前 n 个成员
不能只初始化一些成员/元素。如果您列出初始化类对象或数组,那么所有这些都将被初始化。缺少初始化程序的成员/元素将被初始化。
如果你想这样做,那么你可以做的是默认初始化类对象或数组,然后有选择地初始化子对象。