严格的别名和std :: array与C

当使用gcc 4.7(g ++ - mp-4.7(GCC)4.7.0使用OS X上的MacPorts构建)编译以下代码时,我看到了看似矛盾的结果。

编译器不会抱怨,当我尝试重新解释和解引用一个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

他们为什么对待不同?


当获取std::array的地址时,表达式arr[0]等价于函数调用arr.operator[](0) ,它返回一个引用,而不是指针算术表达式(arr + 0) 。 也许编译器在生成别名警告时不会试图“看透” operator[]函数调用。

链接地址: http://www.djcxy.com/p/10737.html

上一篇: Strict aliasing and std::array vs C

下一篇: Pattern matching on object.member in Play 2.0 templates