Инициализация члена объединения в списке инициализаторов без сужения

В следующем коде

typedef unsigned long col24;
inline col24 MakeRGB24(int R, int G, int B) { return ...; }

struct blitdata
{
union
{
int Flags, Stretch;
col24 Luminance;
};
// (other members)
};

int main()
{
blitdata BlitData =
{
MakeRGB24(0, 0, 0),
// ...
};
}

почему первый инициализатор в списке инициализаторов BlitData выдайте следующую ошибку:

Не константное выражение не может быть сужено от типа col24 (ака unsigned long) чтобы int в списке инициализаторов

Почему компилятор пытается инициализировать int член union с инициализатором, чей тип col24 вместо того, чтобы использовать его для инициализации col24 член?

Компилятор предполагает, что я static_cast результат MakeRGB24 в int, но это может привести к нежелательному сужению.

Как можно Luminance член должен быть правильно инициализирован с использованием результата MakeRGB24 в списке инициализаторов?

Редактировать: blitdata должен остаться POD.

1

Решение

Это, очевидно, нестандартное расширение GCC, но это может быть то, что вы после:

blitdata BlitData =
{
Luminance: MakeRgb24(0,0,0),
};

Если это не подходит для вас, я подозреваю, что назначить его позже — единственный способ.

0

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


По вопросам рекламы [email protected]