C 11 具有非靜態成員初始化器的類別的聚合初始化
在C 11 中,如果類別或結構滿足以下條件,則將其視為聚合:滿足特定標準,包括沒有使用者定義的建構函數、非靜態資料成員沒有大括號或等號初始化程序,並且沒有私有或受保護的非靜態資料成員。
但是,在標準 C 11 中,為類別或結構新增非靜態成員初始值設定項會變更其作為聚合的狀態。這是因為成員初始值設定項類似於使用者定義的建構函數,這使得類別或結構失去了作為聚合的資格。定義中的這種變更可能會導致意外的行為。
在提供的範例中:
struct A { int a = 3; int b = 3; }; A a{0,1}; // ???
由於存在類別內成員初始值設定項,類別 A 不再被視為聚合。結果,聚合初始化A a{0,1};無效。
此行為在 C 14 中進行了修訂,其中非靜態成員初始值設定項的存在不再阻止類別或結構成為聚合。因此,在 C 14 中,A 的聚合初始化是有效的。
需要注意的是,C 標準發生了變化,必須檢查標準的最新版本或使用相容的C 14 或更高版本的編譯器,以確保正確解釋涉及聚合初始化和非靜態成員初始值設定項目的代碼。
以上是具有非靜態成員初始值設定項的 C 類別可以是聚合嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!