当使用gcc 4.7(在OS X上使用MacPorts构建的g ++ -mp-4.7(GCC)4.7.0)编译以下代码时,我得到了看似矛盾的结果。
当我尝试将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
为什么它们被区别对待?