“聚集const成员初始化”不是简单const成员初始化。
在C++中,可以在变量“定义”时赋初值,比如:
int n=0;
对于“聚集”类型如数组和结构,可以使用“聚集常量(Aggregate literal)”,如:
int a[3]={1, 2, 3};
struct S {
int a, b;
};
struct S s={4, 5};
聚集常量可以嵌套,如:
struct S ss[]={ {1, 2}, {3, 4} };
但是不能在变量“声明”时赋初值,比如:
struct ST {
int a=0; // 错误,这是一个变量“声明”,不是“定义”
};
对于static const“整型”成员,这里的“整型”包括各种整数、字符、bool和enum,C++提供了一个语法便利,可以直接将初值写在“声明”处,而不需要单独的定义。但是对于所有其它类型则不允许这样做,上例改为:
struct ST {
const static int a=0; // 正确
// const static float f=1.2; // 错误,只能用于整型成员
// const static int b[3]={1, 2, 3}; // 错误
};
真正的麻烦之处在于聚集类型的初始化甚至不能放在构造函数的初始化列表里,如:
struct ST {
const int b[3];
ST() : b( /* 这个地方没法写,C++目前不能把聚集常量当作简单常量处理 */ )
{
b[0]=1; b[1]=2; b[2]=3; // 错误,因为b被声明为const,这个地方还是没法写
}
};
总之这看起来像是C++语法中的一个小缺陷。
虽然这个缺陷可能在后续的C++标准中完善,但是估计短期内没什么希望,一来因为这样做的需求很小,而C++标准委员会眼前有一大堆更重要的问题要处理;二来这样做之后会不会对老程序造成什么兼容向方面的影响尚须广泛测试。