Эта проблема зависит от используемой версии GCC. На 5.4.0, по крайней мере, следующий код завершится ошибкой:
#include <iostream>
#include <iomanip>
#include <array>
int main() {
uint8_t buf[12] = {0};
std::array<uint8_t, 12> array{0};
uint16_t data = 0x5511;
*(reinterpret_cast<uint16_t*>(&buf[1])) = data;
*(reinterpret_cast<uint16_t*>(&array[1])) = data;
std::cout << __VERSION__ << std::endl;
}
Во время cmpilation с этой ошибкой:
source_file.cpp: In function ‘int main()’:
source_file.cpp:27:43: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
*(reinterpret_cast<uint16_t*>(&buf[1])) = data;
Я понимаю проблему с псевдонимами. Однако есть два вопроса:
- Почему следующая строка соответствует? Почему компилятор в порядке с
std::array
, а не с обычным буфером C?
- Эта ошибка не возникает в более новом компиляторе (выше 7.2). Кто-нибудь знает почему?