Question: This appears to be undefined behavior

```
union A {
  int const x;
  float y;
};

A a = { 0 };
a.y = 1;

```

The spec says

> 
> Creating a new object at the storage location that a const object with static, thread, or automatic storage duration occupies or, at the storage location that such a const object used to occupy before its lifetime ended results in undefined behavior.
> 
> 
> 

But no compiler warns me while it's an easy to diagnose mistake. Am I misinterpreting the wording?

Answer: 
The latest C++0x draft standard is explicit about this:

> 
> In a union, at most one of the non-static data members can be active at any
>  time, that is, the value of at most one of the non-static data members can
>  be stored in a union at any time.
> 
> 
> 

So your statement

```
a.y = 1;

```

is fine, because it changes the active member from `x` to `y`. If you subsequently referenced `a.x` as an rvalue, the behaviour would be undefined:

```
cout << a.x << endl ; // Undefined!

```

Your quote from the spec is not relevant here, because you are not creating any new object.
If it's any consolation - the Microsoft Xbox 360 compiler (which is based on Visual Studio's compiler) does error out. Which is funny, because that's usually the most lenient of the bunch.

```
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

```

This error goes away if I take the `const` away. gcc-based compilers don't complain.

EDIT: The Microsoft Visual C++ compiler has the same warning.