Из 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
.
person
NathanOliver
schedule
18.01.2016
#ifdef
s, я могу, но, похоже, в этом случае нет необходимости. - person Jonathan Mee   schedule 18.01.2016