При компиляции следующего кода с помощью gcc 4.7 (g++-mp-4.7 (GCC) 4.7.0, созданного с помощью MacPorts в OS X) я получаю противоречивые результаты.
Компилятор не ругается, когда я пытаюсь переинтерпретировать и разыменовать секцию std::array
как uint32_t
, но это происходит при использовании массива в стиле C.
Пример кода:
#include <array>
#include <cstdint>
int main() {
std::array<uint8_t, 6> stdarr;
*reinterpret_cast<uint32_t*>(&stdarr[0]) = 0; // OK
uint8_t arr[6];
*reinterpret_cast<uint32_t*>(&arr[0]) = 0;
// ^ error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
}
Команда компилятора:
$ g++ -o test -std=c++0x -Wall -Wextra -Werror main.cpp
Почему они обрабатываются по-разному?