首先,回答主要问题,聚合初始化意味着使用大括号括起来的初始化器列表来初始化聚合的所有成员(即数组或结构[在 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 (引用我发现的草稿)here http://flash-gordon.me.uk/ansi.c.txt):
具有静态存储持续时间的对象的初始值设定项中的所有表达式或具有聚合或联合类型的对象的初始值设定项列表中的所有表达式都应为常量表达式。
这显然限制了聚合初始化的有用性(即使在 1989 年,我相信许多编译器也实现了扩展,以便为非常量表达式启用聚合初始化)。
后来的 C 标准版本没有这个限制,而 C++ 的标准化版本(从 C++98 开始)我相信从来没有任何这样的限制。
我只能猜测,但这也许就是作者的初衷?