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.