1 回答

TA貢獻1860條經驗 獲得超9個贊
在具有類內成員初始化程序的C ++ 11中,結構/類不是聚合的-但是在C ++ 14中已更改。當我第一次遇到它時,我感到很驚訝,這種限制的理由是,類內初始化器與用戶定義的構造函數非常相似,但是計數器參數是沒有人真正期望添加類內初始化器可以使他們的班級/結構非聚集,我肯定沒有。
在C ++ 11標準草案的“ 8.5.1 聚合”部分(重點是我的工作):
集合是一個數組或一個類(第9章),沒有用戶提供的構造函數(12.1),沒有針對非靜態數據成員的括號或相等的初始化程序(9.2),沒有私有或受保護的非靜態數據成員(條款11),沒有基類(條款10)和虛擬函數(10.3)。
在C ++ 14中,同一段內容為:
聚合是沒有用戶提供的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第11章),沒有基類(第10章)以及沒有虛函數(10.3)的數組或類(第9章) )。
這種變化是覆蓋在N3605:成員初始化和骨料它具有以下摘要:
Bjarne Stroustrup和Richard Smith提出了一個關于聚合初始化和成員初始化器無法協同工作的問題。本文建議采用Smith提出的措辭來解決此問題,該措辭消除了聚合不能具有成員初始化程序的限制。
該評論基本上總結了不愿允許它們聚合的想法:
聚合不能具有用戶定義的構造函數,而 成員初始化器本質上是某種用戶定義的構造函數(元素)(另請參見Core Defect 886)。我不反對這種擴展,但是它對我們的聚合模型實際上是有影響的。接受此擴展后,我想知道如何教授什么是聚合。
修訂版N3653于2013年5月通過。
更新資料
emsr指出,G ++ 5.0現在支持使用std=c++1y或使用非靜態數據成員初始化程序的C ++ 14聚合-std=c++14:
struct A { int i, j = i; };
A a = { 42 }; // a.j is also 42
看到它實時運行。
- 1 回答
- 0 關注
- 376 瀏覽
添加回答
舉報