我可以在mem-initializer中初始化一个联合吗?

Raf*_*sta 9 c++

我很惊讶这不起作用:

union DlDatum
{
   float  mFloat;
   s32    mInteger;
};

class DlDbE
{
public:
   DlDbE( float f ) : mData.mFloat( f ) {};
private:
   DlDatum mData;
};
Run Code Online (Sandbox Code Playgroud)

有没有办法在c ++构造函数mem-initializer列表中初始化union?

更新:答案是为union创建构造函数.不知道可以做到的.这是我做的:

union DlDatum
{
   float  mFloat;
   s32    mInteger;
   bool   mBoolean;
   u32    mSymbol;
   u32    mObjIdx; 

   DlDatum(         ) : mInteger( 0 ) {}
   DlDatum( float f ) : mFloat( f )   {}
   DlDatum( s32   i ) : mInteger( i ) {}
   DlDatum( bool  b ) : mBoolean( b ) {}
   DlDatum( u32   s ) : mSymbol( s )  {} // this ctor should work for objIdx also
};

class DlDbE
{
public:
   DlDbE() {}
   DlDbE( float f ) : mData( f ) {}
   DlDbE( u32 i   ) : mData( i ) {}
   DlDbE( bool b  ) : mData( b ) {}
   ...etc..
private:
   DlDatum mData;
};
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 14

在C++ 03中,在您开始为联盟编写构造函数之前.

在C++ 11中,统一初始化将聚合初始化的语法扩展到构造函数初始化列表.这意味着好的旧聚合初始化器语法就像

DlDatum d = { 3.0 };
Run Code Online (Sandbox Code Playgroud)

我们都知道并喜欢C并初始化union的第一个成员,现在也可以在构造函数初始化列表中使用

union DlDatum
{
   float  mFloat;
   s32    mInteger;
};

class DlDbE
{
public:
   DlDbE( float f ) : mData{f} {}
private:
   DlDatum mData;
};
Run Code Online (Sandbox Code Playgroud)

此功能仅允许您"定位"联合的第一个非静态成员以进行初始化.如果你需要更灵活的东西,那么它又回到编写构造函数.


Pup*_*ppy 13

像任何其他成员一样,如果你想构建一个union,你必须给union一个构造函数并调用它.