Строгое псевдоним массива vs std :: array - PullRequest
0 голосов
/ 12 мая 2018

Эта проблема зависит от используемой версии 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;

Я понимаю проблему с псевдонимами. Однако есть два вопроса:

  1. Почему следующая строка соответствует? Почему компилятор в порядке с std::array, а не с обычным буфером C?
  2. Эта ошибка не возникает в более новом компиляторе (выше 7.2). Кто-нибудь знает почему?
...