¿Esto realmente rompe las reglas de alias estricto?
Cuando compilo este código de muestra usando g ++, recibo esta advertencia:
advertencia: desreferenciar el puntero de tipo punteado romperá las reglas de alias estricto[-Wstrict-aliasing]
El código:
#include <iostream>
int main()
{
alignas(int) char data[sizeof(int)];
int *myInt = new (data) int;
*myInt = 34;
std::cout << *reinterpret_cast<int*>(data);
}
En este caso, nodata
alias an int y, por lo tanto, devolverlo a un int no violaría las estrictas reglas de aliasing? ¿O me estoy perdiendo algo aquí?
Editar: Extraño, cuando definodata
Me gusta esto:
alignas(int) char* data = new char[sizeof(int)];
La advertencia del compilador desaparece. ¿La asignación de la pila hace una diferencia con alias estricto? ¿El hecho de que es unchar[]
y no unchar*
significa que en realidad no puede alias de ningún tipo?