Al compilar el siguiente código con gcc 4.7 (g ++ - mp-4.7 (GCC) 4.7.0 construido con MacPorts en OS X) obtengo resultados aparentemente contradictorios.Estricto aliasing y std :: array vs C-style array
El compilador no se queja cuando trato de reinterpretar y desreferenciar una sección de std::array
como uint32_t
, pero lo hace cuando se utiliza una matriz de estilo C.
código Ejemplo:
#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]
}
comandos del compilador es:
$ g++ -o test -std=c++0x -Wall -Wextra -Werror main.cpp
por qué son tratados de manera diferente?
Curiosamente, no recibo ningún error en gcc 4.7 en ubuntu 12.04, 64 bit. – juanchopanza
@juanchopanza ¿Funciona con '-Wstrict-aliasing = 2'? – StackedCrooked
Sí, lo hace. Ni siquiera una advertencia. – juanchopanza