C 11 具有成員初始化器的類別的聚合初始化
C 11 引入了使用大括號對類別進行聚合初始化,允許為類別指定初始化器所有非靜態資料成員。然而,C 11 中的標準提出了一個問題:類別內成員初始值設定項可以存在於聚合結構中嗎?
在 C 11 中,類別中包含成員初始值設定項會使結構或類別成為非聚合。此限制源自於這樣的信念:類別內成員初始值設定項與使用者定義的建構函數具有相似性。但是,新增成員初始值設定項目不應自動取消類別作為聚合的資格。
C 14 標準解決了此問題,修改聚合類別的定義以僅排除使用者提供的建構子、私有或受保護的非靜態建構子資料成員、基底類別和虛函數。已刪除將成員初始值設定項目作為取消限定符包含在內。
因此,在 C 14 中,如下所示的類別現在被視為聚合:
struct A { int a = 3; int b = 3; }; A a{0, 1};
在 C 11 中,上述內容程式碼將無效,因為 A 不是聚合。然而,在 C 14 中,程式碼是有效的,並且物件 a 將使用 a = 0 和 b = 1 進行初始化。
g 的最新版本(5.0 及更高版本)現在支援 C 14 的聚合定義:非靜態成員初始值設定項。因此,範例程式碼將使用 -std=c 14 或 -std=c 1y 在 g 中編譯。
以上是具有成員初始值設定項的類別可以在 C 14 中聚合嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!