непонимание.
Имеется два варианта:
uint8_t data[16];
uint16_t val = *(reinterpret_cast<uint16_t*>(&data[2]));
и
uint8_t data[16];
uint16_t val = *(reinterpret_cast<uint16_t*>(&data[0] + 2));
Первое выдает предупреждение компилятора dereferencing type-punned pointer will break strict-aliasing rules, в то время как второй вариант собирается нормально. Ключевой вопрос — почему? Специфика компилятора, который используется? С моей точки зрения они вообще должны быть идентичны (но не обязаны, ибо внутри компилятора может быть что угодно)
Запомни, кастовать бинарные представления можно только через memcpy (bit_cast since c++20)
Обсуждают сегодня