在對C 的一些形式化描述裡面看到過這個說法, 比如C standards中, 原以為只是生造概念而已, 在Generic Programming and STL中, 看到對這個概念的精確定義, 以及特定的語言特性與這個概念的關聯:
class Test {
public:
int ia [3];
int x;
} t= { {1, 2, },4 };
以上的類定義, 竟然可以用類似C語言中對結構的初始化. 並非每一個類都可以這樣, 正是aggregate type才能如此, 它要求幾個條件:
1. 不能出現任何一個使用者顯式聲明的constructor(因為C 在概念上總會為類造出默認構造函數, 所以強調使用者顯式聲明的)
2. 不能有任何 private或 protected數據成員, 但可以有這樣的成員函數, 這並不意味著數據成員之前不能出現這兩個關鍵字, 比如如下冗余的不起作用的private 就不影響類型是aggregate type:
class T {
private: public: // 有private: 但沒起到作用
int x;
};
3. 不能擁有virtual 成員函數(非virtual成員函數是允許的), 也不得以擁有base class. 這一條是該書中沒有提到的, 畢竟程序員沒辦法指定vtbl應該如何聲明.
VC2008對指定了基類的准 aggregate type給出了這樣的錯誤信息:
Types with a base are not aggregate
對聲明了虛函數(盡管未定義)錯誤信息是:
Types with virtual member functions or virtual bases are not aggregate
容易疑惑的是, aggregate type允許類擁有定義者顯式聲明的destructor, 也允許顯式調用dtor.
看似這個 aggregate type與POD類型並沒有太大關系.
對aggregate type的初始化語法中, 概念上應該以嵌套的{}指定的內容, 如果所有元素都顯式指定, 可以去掉嵌套的{}, 如
class Test {
public:
int ia [3];
int x;
} t= { {1, 2, 3},4 };
也可為
t = { 1, 2, 3, 4};
只有嵌套的{}中有剩余的未初始化的元素時, 才必需使用嵌套的{}:
t = { {1, 2, }, 4};
注意在初始化語法中, 向來可以在最後一個元素有一個額外的逗號, 即使後面已沒有更多的元素可以指定時( t = { {1,2,3,}, 4, };)
在嵌套的{}中指定空元素是合法的(但不允許再有一個逗號)
t = { {}, 4}; // 合法