当使用 gcc 4.7(在 OS X 上使用 MacPorts 构建的 g++-mp-4.7 (GCC) 4.7.0)编译以下代码时,我得到看似矛盾的结果。
当我尝试将 an 的一部分重新解释和取消引用std::array
为 an时,编译器不会抱怨,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
为什么他们会受到不同的对待?