L’initialisation globale des champs de bits est-elle autorisée?

J’ai une structure qui contient des champs de bits:

struct Foo { unsigned a : 16, b : 16; }; 

Et je veux savoir si je peux utiliser l’initialisation d’agrégat sur ses champs de bits. Par exemple:

 struct Foo bar = {13, 42}; 

Je remarque que cela fonctionne dans gcc 5.1 et Visual Studio 2015. Je voudrais juste quelque chose à certifier qu’il s’agissait d’une initialisation approuvée standard pour C et C ++.

De C ++ 14 [dcl.init.aggr] nous avons

Un agrégat est un tableau ou une classe (clause 9) sans constructeurs fournis par l’utilisateur (12.1), aucun membre de données privé ou protégé non statique (clause 11), aucune classe de base (clause 10) et aucune fonction virtuelle (10.3). ).

Donc, Foo est un agrégat et qualifie pour son initialisation. Ensuite nous avons

Lorsqu’un agrégat est initialisé par une liste d’initialisateurs, comme spécifié au 8.5.4, les éléments de la liste d’initialiseurs sont utilisés comme initialiseurs pour les membres de l’agrégat, en ordre croissant d’indice ou de membre. […]

et

Les membres de données statiques et les champs de bits anonymes ne sont pas considérés comme des membres de la classe aux fins de l’initialisation de l’agrégat.

Donc dans votre cas, ils seront initialisés car ils ne sont pas anonymes et ils seront initialisés dans l’ordre dans struct ils apparaissent dans la struct .

À partir de C11 6.2.5 (21) nous avons

Les types arithmétiques et les types de pointeur sont collectivement appelés types scalaires. Les types de tableau et de structure sont collectivement appelés types d’agrégats. 46 )

Donc, en C, nous avons toujours affaire à un ensemble. Puis en 6.7.9 (9) nous avons

Sauf indication contraire explicite, aux fins du présent paragraphe, les membres non nommés d’objects de type structure et union ne participent pas à l’initialisation. Les membres non identifiés d’objects de structure ont une valeur indéterminée même après l’initialisation.

et 6.7.9 (17)

Chaque liste d’initialiseur entre accolades est associée à un object en cours. Lorsqu’aucune désignation n’est présente, les sous-objects de l’object en cours sont initialisés dans l’ordre en fonction du type de l’object en cours: éléments de tableau par ordre croissant d’indice, membres de structure dans l’ordre de déclaration et premier membre nommé d’une union. 148 ) En revanche, une désignation entraîne l’initialisation suivant pour commencer l’initialisation du sous-object décrit par l’indicateur. L’initialisation se poursuit ensuite dans l’ordre, en commençant par le sous-object suivant après celui décrit par l’indicatif. 149 )

Nous avons donc le même comportement qu’en C ++ où les champs de bits anonymes ne sont pas initialisés, mais comme ils sont nommés, ils seront initialisés dans l’ordre dans lequel ils apparaissent dans la struct .