Isso realmente quebra as regras de alias estrito?

Ao compilar esse código de exemplo usando g ++, recebo este aviso:

aviso: desmarcando o ponteiro puncionado por tipo violará regras de alias estrito[-Wstrict-aliasing]

O 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);
}

Nesse caso, nãodata alias um int e, portanto, convertê-lo de volta para um int não violaria regras estritas de aliasing? Ou estou faltando alguma coisa aqui?

Edit: Estranho, quando eu definodata como isso:

alignas(int) char* data = new char[sizeof(int)];

O aviso do compilador desaparece. A alocação da pilha faz diferença com aliasing estrito? O fato de ser umchar[] e não umchar* significa que ele não pode realmente usar o apelido de qualquer tipo?

questionAnswers(2)

yourAnswerToTheQuestion