有const和非const成员的并集?

| 这似乎是未定义的行为
union A {
  int const x;
  float y;
};

A a = { 0 };
a.y = 1;
规格说   在具有静态,线程或自动存储持续时间的const对象所占据的存储位置处创建新对象,或者在此类const对象在其生命周期结束前曾经占据的存储位置处创建新对象会导致不确定的行为。 但是,这很容易诊断错误,没有编译器警告我。我会误解措辞吗?     
已邀请:
最新的C ++ 0x草案标准对此是明确的:   在一个联合中,任意一个非静态数据成员最多可以处于活动状态   时间,即最多非静态数据成员之一的值可以   可以随时存储在工会中。 所以你的陈述
a.y = 1;
很好,因为它将活动成员从
x
更改为
y
。如果随后将“ 4”引用为右值,则该行为将是不确定的:
cout << a.x << endl ; // Undefined!
您在规范中引用的内容与此处无关,因为您没有创建任何新对象。     
由ѭ7的ѭ6成员实际上没有任何意义,我对该标准允许它感到惊讶。对
union
进行限制的所有目的都是为了达到这样一个点:按位赋值将是所有成员的有效赋值运算符,并且不能使用按位赋值来赋值给
const int
。我的猜测是,这只是以前没有人想到的一种情况(尽管它影响到C和C ++,所以已经存在了一段时间)。     
如果可以的话,Microsoft Xbox 360编译器(基于Visual Studio的编译器)会出错。这很有趣,因为这通常是最宽松的。
error C2220: warning treated as error - no \'object\' file generated
warning C4510: \'A\' : default constructor could not be generated
    : see declaration of \'A\'
warning C4610: union \'A\' can never be instantiated - user defined constructor required
如果我拿走6英镑,这个错误就会消失。基于gcc的编译器不会抱怨。 编辑:Microsoft Visual C ++编译器具有相同的警告。     

要回复问题请先登录注册