Допускается ли совокупная инициализация битовых полей?

У меня есть структура, которая содержит битовые поля:

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

И я хочу знать, могу ли я использовать агрегатную инициализацию для его битовых полей. Например:

struct Foo bar = {13, 42};

Отмечу что это работает в gcc 5.1 и Visual Studio 2015. Я просто хотел бы кое-что подтвердить, что это была стандартная одобренная инициализация для C и C ++.

3

Решение

Из 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)

Каждый заключенный в скобки список инициализаторов имеет связанный текущий объект. Когда нет
обозначения присутствуют, подобъекты текущего объекта инициализируются в порядке, соответствующем типу текущего объекта: элементы массива в порядке возрастания индекса, элементы структуры в порядке объявления и первый именованный член объединения.148) Напротив, обозначение заставляет следующий инициализатор начать инициализацию подобъекта, описанного указателем. Инициализация затем продолжается вперед по порядку, начиная со следующего подобъекта после того, что описано указателем.149)

Таким образом, у нас такое же поведение, как и в C ++, где анонимные битовые поля не инициализируются, но, поскольку они названы, они будут инициализированы в порядке их появления в struct,

8

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector