“聚集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++標準委員會眼前有一大堆更重要的問題要處理;二來這樣做之后會不會對老程序造成什么兼容向方面的影響尚須廣泛測試。