| ▲ | jcranmer 4 hours ago | ||||||||||||||||||||||
No, you're not. You're allowed to access any type via a char buffer. But the converse is not true (quoting https://eel.is/c++draft/expr#basic.lval-11): > An object of dynamic type Tobj is type-accessible through a glvalue of type Tref if Tref is similar ([conv.qual]) to: Tobj, a type that is the signed or unsigned type corresponding to Tobj, or a char, unsigned char, or std :: byte type. If a program attempts to access ([defns.access]) the stored value of an object through a glvalue through which it is not type-accessible, the behavior is undefined. The dynamic type of a char buffer is, well, a char buffer, and can only be accessed via things that are the same type as a char buffer up to signedness and cv-qualification. The actual strict aliasing rules are not commutative! | |||||||||||||||||||||||
| ▲ | denotational an hour ago | parent | next [-] | ||||||||||||||||||||||
If the type is an implicit-lifetime type, then you can legally create an unsigned char array, and then reinterpret_cast a pointer to that to a pointer to the type. See https://eel.is/c++draft/intro.object#def:object,implicit_cre.... https://eel.is/c++draft/intro.object#15 is an example showing this with malloc; the subsequent paragraph further permits it to work with an unsigned char array. | |||||||||||||||||||||||
| ▲ | groundzeros2015 3 hours ago | parent | prev [-] | ||||||||||||||||||||||
I’m not a language lawyer but i think the part you are missing is about “type establishment”. (Is this a C vs C++ thing?) Malloc returns a buffer and then you cast it to the type you want. Similarly for all memory allocators. Punning the same region of char buffer as two different types is a bit different. | |||||||||||||||||||||||
| |||||||||||||||||||||||