“聚集const成員初始化”不是簡(jiǎn)單const成員初始化。
在C++中,可以在變量“定義”時(shí)賦初值,比如:
int n=0;
對(duì)于“聚集”類型如數(shù)組和結(jié)構(gòu),可以使用“聚集常量(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} };
但是不能在變量“聲明”時(shí)賦初值,比如:
struct ST {
int a=0; // 錯(cuò)誤,這是一個(gè)變量“聲明”,不是“定義”
};
對(duì)于static const“整型”成員,這里的“整型”包括各種整數(shù)、字符、bool和enum,C++提供了一個(gè)語(yǔ)法便利,可以直接將初值寫(xiě)在“聲明”處,而不需要單獨(dú)的定義。但是對(duì)于所有其它類型則不允許這樣做,上例改為:
struct ST {
const static int a=0; // 正確
// const static float f=1.2; // 錯(cuò)誤,只能用于整型成員
// const static int b[3]={1, 2, 3}; // 錯(cuò)誤
};
真正的麻煩之處在于聚集類型的初始化甚至不能放在構(gòu)造函數(shù)的初始化列表里,如:
struct ST {
const int b[3];
ST() : b( /* 這個(gè)地方?jīng)]法寫(xiě),C++目前不能把聚集常量當(dāng)作簡(jiǎn)單常量處理 */ )
{
b[0]=1; b[1]=2; b[2]=3; // 錯(cuò)誤,因?yàn)閎被聲明為const,這個(gè)地方還是沒(méi)法寫(xiě)
}
};
總之這看起來(lái)像是C++語(yǔ)法中的一個(gè)小缺陷。
雖然這個(gè)缺陷可能在后續(xù)的C++標(biāo)準(zhǔn)中完善,但是估計(jì)短期內(nèi)沒(méi)什么希望,一來(lái)因?yàn)檫@樣做的需求很小,而C++標(biāo)準(zhǔn)委員會(huì)眼前有一大堆更重要的問(wèn)題要處理;二來(lái)這樣做之后會(huì)不會(huì)對(duì)老程序造成什么兼容向方面的影響尚須廣泛測(cè)試。