**Reference (section label):** [basic.lval] ## Issue description ```cpp int x = -1; auto y = *reinterpret_cast<unsigned*>(&x); / read value through different type *reinterpret_cast<unsigned*>(&x) = UINT_MAX; / modify value through different type ``` An object of type `int` is [type-accessible](https://eel.is/c++draft/basic.lval#def:type-accessible) through a glvalue of type `unsigned`. However, [[conv.lval] p3.4](https://eel.is/c++draft/conv.lval#3.4) states: > Otherwise, the object indicated by the glvalue is read ([[defns.access]](https://eel.is/c++draft/defns.access)), and the value contained in the object is the prvalue result. We obviously require a prvalue of `unsigned` type for the initialization of `y`, and the `-1` value contained in the `int` object has the wrong type and and cannot be represented as `unsigned`. Similarly, [[expr.ass] p2](https://eel.is/c++draft/expr.ass#2) states: > In simple assignment (`=`), the object referred to by the left operand is modified ([[defns.access]](https://eel.is/c++draft/defns.access)) by replacing its value with the result of the right operand. This cannot be done because it would require storing a `UINT_MAX` value of `unsigned` type in an object of type `int`. ## Suggested resolution In [[basic.lval] p11](https://eel.is/c++draft/basic.lval#11), add the following sentence: > When an object of dynamic type <code>T<sub>obj</sub></code> is accessed through a glvalue of type <code>T<sub>ref</sub></code>, <code>T<sub>obj</sub></code> is type-accessible through <code>T<sub>ref</sub></code>, and <code>T<sub>ref</sub></code> is not the same type as <code>T<sub>obj</sub></code>, an unspecified conversion from the stored value to <code>T<sub>ref</sub></code> takes place when the object's value is read, and an unspecified conversion from the to-be-stored value to <code>T<sub>obj</sub></code> takes place when the object is modified.