在C++中静态初始化匿名联合

wpf*_*abe 13 c++ initialization visual-c++ unions

我试图在Visual Studio 2010中静态初始化以下结构:

struct Data
{
   int x;
   union
   {
      const Data* data;
      struct {int x; int y; };
   };
};
Run Code Online (Sandbox Code Playgroud)

以下是失败的error C2440: 'initializing' : cannot convert from 'Data *' to 'char'.

static Data d1;
static Data d = {1, &d1};
static Data d2 = {1, {1, 2}};
Run Code Online (Sandbox Code Playgroud)

我已经找到了一些可以正确初始化的方法的引用,但它们都不能在VS2010中工作.有任何想法吗?

Pav*_*aev 24

ISO C++ 03 8.5.1 [dcl.init.aggr]/15:

当使用大括号括起初始值设定项初始化联合时,大括号应仅包含联合的第一个成员的初始化程序.[例:

union u { int a; char* b; };
u a = { 1 };
u b = a;
u c = 1; // error
u d = { 0, "asdf" }; // error
u e = { "asdf" }; // error
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

所以,一般来说,它无法完成.


Chr*_*isW 5

你能通过定义重载的构造函数来实现吗?未经测试的代码:

struct Data 
{ 
    int x; 
    union 
    { 
        const Data* data; 
        struct {int a; int b; } z; 
    } y;

    Data()
    {
        x = 0;
        y.data = 0;
        y.z.a = 0;
        y.z.b = 0;
    }

    Data(int x_, Data* data_)
    {
        x = x_;
        y.data = data_;
    }

    Data(int x_, int a_, int b_)
    {
        x = x_;
        y.z.a = a_;
        y.z.b = b_;
    }
}; 

static Data d1; 
static Data d(1, &d1); 
static Data d2(1, 1, 2); 
Run Code Online (Sandbox Code Playgroud)