首先,回答主要问题,聚合初始化意味着使用大括号括起来的初始化列表来初始化聚合的所有成员(即数组或结构[在 C++ 中,只有某些类型的结构算作聚合])。
明显地,
int ar[] = { 1 , 2 };
比安全
int ar[2];
ar[0] = 1;
ar[1] = 2;
因为后者为初始化单个元素的索引中的拼写错误和其他错误提供了充足的机会。
看看今天的 C 和 C++,我不清楚作者为什么要区分 C 和 C++。两种语言都支持数组的聚合初始化。
一种可能性是作者引用了 C 标准的旧版本。值得注意的是,在 ANSI C (C89) 中,对聚合初始化的使用有一个重要限制:所有初始化器都必须是常量表达式:
/* This is possible in C89: */
f(int i)
{ int ar[] = { 1 , 2 }; }
/* But this is not
(because i is not a constant expression):
*/
f(int i)
{ int ar[] = { i , i+1 }; }
这是由于 C89 中的 3.5.7(引用我在这里找到的草稿):
具有静态存储持续时间的对象的初始化程序或具有聚合或联合类型的对象的初始化程序列表中的所有表达式都应为常量表达式。
这显然限制了聚合初始化的有用性(即使在 1989 年,我相信许多编译器也实现了扩展以启用非常量表达式的聚合初始化)。
后来的 C 标准版本没有这个限制,我相信 C++ 的标准化版本(从 C++98 开始)从来没有任何这样的限制。
我只能推测,但也许这就是作者的想法?