Это действительно нарушает правила строгого наложения имен?
Когда я компилирую этот пример кода, используя 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)];
Предупреждение компилятора исчезает. Распределение стека имеет значение со строгим псевдонимом? Имеет ли тот факт, что этоchar[]
и неchar*
значит, это не может на самом деле псевдоним любого типа?