在初始化列表中初始化union成员而不缩小

时间:2015-07-23 14:30:12

标签: c++ initialization unions initializer-list narrowing

在以下代码中,

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成员?< / p>

编译器建议我static_cast MakeRGB24int的结果,但这可能会导致不必要的缩小。

如何使用初始值设定项列表中Luminance的结果正确初始化MakeRGB24成员?

修改: blitdata应保留POD。

1 个答案:

答案 0 :(得分:0)

这显然是一个非标准的gcc扩展,但这可能是你所追求的:

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

如果这对你没有好处,我怀疑之后分配它是唯一的方法。