Строгие псевдонимы и std::array против массива в стиле C

При компиляции следующего кода с помощью 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

Почему они обрабатываются по-разному?

7
задан curiousguy 20 July 2012 в 14:59
поделиться