В следующем коде
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.
main
) очень упрощена. Первый предоставленный вами инициализатор инициализирует первый элементBlitData
. - person dyp   schedule 23.07.2015sizeof(unsigned long)
имеет какое-либо конкретное значение, за исключением того, что оно не меньшеsizeof(int)
. - person Walter   schedule 23.07.2015{..}
в стиле POD. - person dyp   schedule 23.07.2015main
пытается инициализировать элементFlags
. Однако преобразование изunsigned long
(он жеcol24
) вint
не было недопустимым в C++03. Так что переход на С++ 11, я полагаю, обнаружил какую-то ошибку. - person dyp   schedule 23.07.2015