I had a discussion with someone on IRC and this question turned up. We are allowed by the Standard to change an object of type `int` by a `char` lvalue. 

```
int a;
char *b = (char*) &a;
*b = 0;

```

Would we be allowed to do this in the opposite direction, if we know that the alignment is fine?

The issue I'm seeing is that the aliasing rule does not cover the simple case of the following, if one considers the aliasing rule as a non-symmetric relation

```
int a;
a = 0;

```

The reason is, that each object contains a sequence of `sizeof(obj)` `unsigned char` objects (called the "object representation"). If we change the `int`, we will change some or all of those objects. However, the aliasing rule only states we are allowed to change a `int` by an `char` or `unsigned char`, but not the other way around. Another example

```
int a[1];
int *ra = a;
*ra = 0;

```

Only one direction is described by 3.10/15 ("An aggregate or union type that includes..."), but this time we need the other way around ("A type that is the element or non-static data member type of an aggregate...").

Is the other direction implied? This question also applies to C.