[英]Is Aggregate Initialization of Bit-Fields Allowed?
我有一個包含位字段的結構:
struct Foo {
unsigned a : 16, b : 16;
};
我想知道我是否可以在它的位字段上使用聚合初始化。 例如:
struct Foo bar = {13, 42};
我注意到這在gcc 5.1和Visual Studio 2015中都有效。我只想要證明這是C和C ++的標准批准初始化。
從C ++ 14 [dcl.init.aggr]
我們有
聚合是一個數組或類(第9條),沒有用戶提供的構造函數(12.1),沒有私有或受保護的非靜態數據成員(第11條),沒有基類(第10條),沒有虛函數(10.3) )。
所以Foo
是聚合初始化的聚合資格。 然后我們有
當聚合由初始化列表初始化時,如8.5.4中所述,初始化列表的元素被視為聚合成員的初始化者,增加下標或成員順序。[...]
和
出於聚合初始化的目的,靜態數據成員和匿名位字段不被視為類的成員。
所以在你的情況下,它們將被初始化,因為它們不是匿名的,它們將按照它們在struct
出現的順序進行初始化。
從C11 6.2.5(21)我們得到
算術類型和指針類型統稱為標量類型。 數組和結構類型統稱為聚合類型。 46 )
所以在C中我們仍在處理聚合。 然后在6.7.9(9)我們有
除非另有明確說明,否則為了本子條款的目的,結構和聯合類型的對象的未命名成員不參與初始化。 即使在初始化之后,未命名的結構對象成員也具有不確定的值。
和6.7.9(17)
每個大括號括起的初始化列表都有一個關聯的當前對象。 當沒有指定時,根據當前對象的類型按順序初始化當前對象的子對象:增加下標順序的數組元素,聲明順序中的結構成員,以及union的第一個命名成員。 148 )相反,指定使得以下初始化器開始由指示符描述的子對象的初始化。 然后,初始化按順序繼續向前,從指定者描述的下一個子對象開始。 149 )
因此,我們的行為與C ++中的行為相同,其中匿名位字段未初始化,但由於它們被命名,因此它們將按照它們在struct
出現的順序進行初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.