c++ c++17 strict-aliasing

c++ - ¿Tiene un puntero std:: byte las mismas implicaciones de alias que char*?



c++17 strict-aliasing (1)

Las reglas estrictas de aliasing de C ++ (y C) incluyen que un char* y un unsigned char* pueden alias a cualquier otro puntero.

AFAIK no hay una regla análoga para uint8_t* .

Por lo tanto, mi pregunta: ¿Cuáles son las reglas de aliasing para un puntero std::byte ?

La referencia de C ++ actualmente solo std::byte :

Al igual que los tipos de caracteres (char, unsigned char, signed char), se puede usar para acceder a la memoria en bruto ocupada por otros objetos (representación de objetos), pero a diferencia de esos tipos, no es un tipo de carácter y no es un tipo aritmético.


Del borrador estándar actual ([basic.types] / 2):

Para cualquier objeto (que no sea un subobjeto de clase base) de tipo T que se pueda copiar de forma trivial, ya sea que el objeto tenga un valor válido de tipo T, los bytes subyacentes ([intro.memory]) que forman el objeto se pueden copiar en un matriz de char, unsigned char o std :: byte ([cstddef.syn]). 43 Si el contenido de esa matriz se copia de nuevo en el objeto, el objeto mantendrá su valor original.

Así que sí, las mismas reglas de alias se aplican a los tres tipos, al igual que cppreference se resume.

También podría ser valioso mencionar ([basic.lval] /8.8):

Si un programa intenta acceder al valor almacenado de un objeto a través de un glvalue distinto de uno de los siguientes tipos, el comportamiento no está definido:

  • un tipo char, unsigned char o std :: byte.