7
當用gcc 4.7(g ++ - mp-4.7(GCC)4.7.0用OS X上的MacPorts構建)編譯下面的代碼時,我看到了矛盾的結果。嚴格別名和std :: array與C風格的數組
當我嘗試將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
他們爲什麼區別對待?
有趣的是,我在ubuntu 12.04,64位上對gcc 4.7沒有任何錯誤。 – juanchopanza
@juanchopanza它是否適用於'-Wstrict-aliasing = 2'? – StackedCrooked
是的,它的確如此。甚至沒有警告。 – juanchopanza