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?