簡體   English   中英

是否允許比特字段的聚合初始化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM