Когда я скомпилирую этот пример кода с помощью g++, я получаю это предупреждение:
предупреждение: разыменованный тип-караульный указатель нарушит правила строгого сглаживания
[-Wstrict-aliasing]
Код:
#include <iostream>
int main()
{
alignas(int) char data[sizeof(int)];
int *myInt = new (data) int;
*myInt = 34;
std::cout << *reinterpret_cast<int*>(data);
}
В этом случае, не имеет ли data
псевдоним int, и поэтому отбрасывание его обратно в int не будет нарушать строгие правила псевдонимов? Или я здесь что-то не хватает?
Изменить: странно, когда я определяю data
следующим образом:
alignas(int) char* data = new char[sizeof(int)];
Предупреждение компилятора исчезает. Выделяет ли распределение стека значение со строгим псевдонимом? Означает ли факт, что это a char[]
, а не char*
означает, что он не может на самом деле псевдоним какого-либо типа?