Использование таких вложенных обозначенных инициализаторов кажется чем-то вроде крайнего случая. Следующее работает как в clang-cl
(в Visual Studio 2019), так и в собственном компиляторе MSVC
(но последний только с опцией /std:c++latest
, которая использует черновой стандарт C ++ 20):
struct inner {
int x, y;
double z;
};
struct outer {
char a;
double b;
inner c;
};
outer my_outer = { .a = 'a', .b = 1.2, .c = { .x = 3, .y = 4, .z = 5.6 } };
При clang-cl
инициализатор может быть сокращен до следующей формы:
outer my_outer = { .a = 'a', .b = 1.2, .c.x = 3, .c.y = 4, .c.z = 5.6 };
, но MSVC
жалуется в этом случае, с:
ошибка C7558: доступ к вложенным элементам не разрешен в стандартных инициализаторах C ++; используйте вложенный список инициализаторов
Итак, для вашего примера вы можете попробовать это:
Car car =
{
.color = RED,
.tire = {
.tread = OLD,
.diameter = 27.106,
.material.type = RUBBER,
.material.density = 700,
}
};
Есть полезное "обсуждение" topi c в cppreference , причем эта часть примечательна:
... каждый указатель должен называть прямой нестатический c элемент данных T, и все указатели, используемые в выражении, должны появляться в в том же порядке, что и данные членов T.