2012-05-12 21 views
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 

他們爲什麼區別對待?

+0

有趣的是,我在ubuntu 12.04,64位上對gcc 4.7沒有任何錯誤。 – juanchopanza

+0

@juanchopanza它是否適用於'-Wstrict-aliasing = 2'? – StackedCrooked

+0

是的,它的確如此。甚至沒有警告。 – juanchopanza

回答

3

服用時std::array的地址,表達arr[0]等同於函數調用arr.operator[](0)它返回一個參考,而不是指針算術表達式(arr + 0)。也許編譯器在生成別名警告時不會嘗試「透視」operator[]函數調用。